“ $ keymaterial必须是字符串,资源或openssmmetrickey”。 Firebase/PHP-JWT解码功能中的错误

发布于 2025-02-10 20:33:37 字数 8 浏览 0 评论 0原文

continue

I'm using the below php code to retrieve the keys from given google docs url and it's working fine because I can check them on my browser. The code is based on this answer.

<?php

require_once('../vendor/autoload.php');
require_once('../vendor/firebase/php-jwt/src/BeforeValidException.php');
require_once('../vendor/firebase/php-jwt/src/ExpiredException.php');
require_once('../vendor/firebase/php-jwt/src//SignatureInvalidException.php');

use \Firebase\JWT\JWT;
use \Firebase\JWT\Key;

$token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJmaXJlYmFzZS1hZG1pbnNkay04Y25oM0BvcmRlcnMtYXBwLTdiMTYxLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic3ViIjoiZmlyZWJhc2UtYWRtaW5zZGstOGNuaDNAb3JkZXJzLWFwcC03YjE2MS5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImF1ZCI6Im9yZGVycy1hcHAtN2IxNjEiLCJpYXQiOjE2NTU5MjY3NzAsImV4cCI6MTY1NTkzMDM3MCwidWlkIjoxLCJjbGFpbXMiOnsiZnVsbG5hbWUiOiJNYWRzb24ifX0.XVdrqlzKxEexcDwbRzxrPiVXwcV9WHPBjSvYxkO86DmSZXGzt2Fpqe-Vuy3qhDHD5B73vqnKRNxomPil47ig49AGJPmci9o0HeZCt1lr7WVtKyPa4uHudkLor3c3VrhXstfXFnrCo6t9UHDLmAPUjeLbKKA4w1mqygN7KCTMCXbKV7QQgqsVfxu0DdI4npuBWEBj3z0W3vJaXz0R3NvpdMWgrVvBc5YXGn_NB2JQ9HvrLG2U2WYvqKWtIJF5xrDKP48OgU1-DO82dQFu2ouLN0dOjnmbOLU8qlau21rXeCu0zMbJ5C-_5kI5EIsXSs22yYU-BPXsGRhRwRAOo85GSA";

$keys_file = "publicKeys.json"; // the file for the downloaded public keys
$cache_file = "pkeys.cache"; // this file contains the next time the system has to revalidate the keys

/**
 * Checks whether new keys should be downloaded, and retrieves them, if needed.
 */
function checkKeys()
{

    global $cache_file;

    if (file_exists($cache_file)) {

        $fp = fopen($cache_file, "r+");

        if (flock($fp, LOCK_SH)) {

            $contents = fread($fp, filesize($cache_file));

            if ($contents > time()) {

                flock($fp, LOCK_UN);

            } elseif (flock($fp, LOCK_EX)) { // upgrading the lock to exclusive (write)

                // here we need to revalidate since another process could've got to the LOCK_EX part before this
                if (fread($fp, filesize($cache_file)) <= time()) {
                    refreshKeys($fp);
                }
                flock($fp, LOCK_UN);
            } else {
                throw new \RuntimeException('Cannot refresh keys: file lock upgrade error.');
            }
        } else {
            // you need to handle this by signaling error
            throw new \RuntimeException('Cannot refresh keys: file lock error.');
        }

        fclose($fp);
    } else {
        refreshKeys();
    }
}

/**
 * Downloads the public keys and writes them in a file. This also sets the new cache revalidation time.
 * @param null $fp the file pointer of the cache time file
 */
function refreshKeys($fp = null)
{

    global $keys_file;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/robot/v1/metadata/x509/[email protected]");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);

    $data = curl_exec($ch);

    $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $headers = trim(substr($data, 0, $header_size));
    $raw_keys = trim(substr($data, $header_size));

    if (preg_match('/age:[ ]+?(\d+)/i', $headers, $age_matches) === 1) {

        $age = $age_matches[1];

        if (preg_match('/cache-control:.+?max-age=(\d+)/i', $headers, $max_age_matches) === 1) {

            $valid_for = $max_age_matches[1] - $age;
            ftruncate($fp, 0);
            fwrite($fp, "" . (time() + $valid_for));
            fflush($fp);
            // $fp will be closed outside, we don't have to

            $fp_keys = fopen($keys_file, "w");
            if (flock($fp_keys, LOCK_EX)) {

                fwrite($fp_keys, $raw_keys);
                fflush($fp_keys);
                flock($fp_keys, LOCK_UN);
            }
            fclose($fp_keys);
        }
    }
}

/**
 * Retrieves the downloaded keys.
 * This should be called anytime you need the keys (i.e. for decoding / verification).
 * @return null|string
 */
function getKeys()
{

    global $keys_file;

    $fp = fopen($keys_file, "r");
    $keys = null;

    if (flock($fp, LOCK_SH)) {

        $keys = fread($fp, filesize($keys_file));
        flock($fp, LOCK_UN);
    }

    fclose($fp);

    return $keys;
}

checkKeys();

$pKeys_raw = getKeys();
// echo json_encode($pKeys_raw); exit;

if ($pKeys_raw) {

    $pkeys = json_decode($pKeys_raw, true);
    // $decodejwt = JWT::decode($token, $pkeys, ["RS256"]);

    $decodejwt = JWT::decode($token, new Key($pkeys, "RS256"));
    $decoded_array = (array) $decodejwt;
    echo "Decode:\n" . print_r($decoded_array, true) . "\n";
} else {
    echo "empty";
}

These are the keys from google api:

{
  "1aef569f52414e9f4a7104b6d071f066dfeed677":
  "-----BEGIN CERTIFICATE-----
  \nMIIDHDCCAgSgAwIBAgIIQ8idkMV5aoQwDQYJKoZIhvcNAQEFBQAwMTEvMC0GA1UE
  \nAwwmc2VjdXJldG9rZW4uc3lzdGVtLmdzZXJ2aWNlYWNjb3VudC5jb20wHhcNMjIw
  \nNjA0MDkzODQyWhcNMjIwNjIwMjE1MzQyWjAxMS8wLQYDVQQDDCZzZWN1cmV0b2tl
  \nbi5zeXN0ZW0uZ3NlcnZpY2VhY2NvdW50LmNvbTCCASIwDQYJKoZIhvcNAQEBBQAD
  \nggEPADCCAQoCggEBAM9SHVisixHJe5omHxC4iUIdPoKmODvIkVWt4VgJQk4XNUn3
  \nm8J1JRIVfIuNCLFiwvQUKu2Gb8e4pQQY0DAuTeno3NY+HLvb6dgq04tXWWo44IHQ
  \n8t6IZoctzI9Vz41Vi/te9sk0fU5mMSX2zkQPmN4eSkwA9Vxcm1I1C+9m2njM6+Fy
  \nrGfA5PPpFCKEU3rvWNalS/oOHQK9oG9ch4QXDm6ax6wgPXdxCMTm/oX58h+0d4F0
  \n0iO20NEHFbjT5C+B4S+d4HOYVfY3tJOmtVBHxMNGe4N5LamsLQIqDRoQId14oT/A
  \nYrFvp1RYLkkNXfiShmkHtgH9iutDi6as5LIzLgUCAwEAAaM4MDYwDAYDVR0TAQH/
  \nBAIwADAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwDQYJ
  \nKoZIhvcNAQEFBQADggEBAJjhWc3AO86f/5SFontdVUrRC+C7c+u9EyE8WMnEX5eK
  \nU05vEiqqi22MR+Cv3SaB1gC/koKt7gGWKR+n7yRCdRHQALK0gSpIb6K4aSJR3qKW
  \naR0TrXSisRVEHwMXVWAXMHM+jCHsFCDf4EJlm2CJMLODKNdwOsRdxG0No6sB7I92
  \nattm8pJ2+qL+Q/Pe7NwTMd5PlEHxebJZFDAE5+F6QeO7hRPftA6B/PT+lTSRmdbS
  \nRIJgAJmUFO5rSmcIsrcyCCrI9IbwKyA7qP8jKQ30ROHJyR10smTRYAIvpXhZbPm2
  \nPxgtkJNN0GCVv7fLEnpWzF4+6nUe73sbdzLPdXIdL6A=
  \n-----END CERTIFICATE-----\n",
  "f90fb1ae048a548fb681ad6092b0b869ea467ac6":
  "-----BEGIN CERTIFICATE-----
  \nMIIDHTCCAgWgAwIBAgIJAI5jwaS/+yl0MA0GCSqGSIb3DQEBBQUAMDExLzAtBgNV
  \nBAMMJnNlY3VyZXRva2VuLnN5c3RlbS5nc2VydmljZWFjY291bnQuY29tMB4XDTIy
  \nMDYxMjA5Mzg0NVoXDTIyMDYyODIxNTM0NVowMTEvMC0GA1UEAwwmc2VjdXJldG9r
  \nZW4uc3lzdGVtLmdzZXJ2aWNlYWNjb3VudC5jb20wggEiMA0GCSqGSIb3DQEBAQUA
  \nA4IBDwAwggEKAoIBAQC/UMsDz3GlGlDZsDYq7//fjP3x4hKdPVygGADdA2OK2akz
  \n7it/Wk80fowrE46PhnG/NJ4aU6MHteJDBfeVAn5kN5K9Ljl9YgqsNbfcDIWf5nhU
  \nUktVFvuPiyotrrGxOPmuRskEPDAZsZc6jfujkTB+fRLnYYUOOXYAsp7EiC7txQoo
  \nezKSv+HoPpF2HCke+Mb8fk6ar2ZjvAPEtO+1jKuk3fA40B/i4ywmf0YOAywC7tSS
  \nENIgJfmOaFVQO9gkDcUqiQXKMbs91602eHTSmsv8K0fUGzx/TqxbBApAxMNSsoTI
  \nQe5zZvNY18ZdGtz5z+BE1Y/2Tu/M5NwAgVJaUDsXAgMBAAGjODA2MAwGA1UdEwEB
  \n/wQCMAAwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMCMA0G
  \nCSqGSIb3DQEBBQUAA4IBAQAjXtjKN4RPPNEVTDAWcOuao7kiD+8zjzz25aXz+32d
  \nUawyBF602j3Q2hPIfLBp2Zja7crigzKHBXF7bixLkleKkSb/0HLwoNPH4AiPneJn
  \njSVyvcOGQ4x4ktDwlYWQZJM8hGkurvf6IUf4uJf5wEyMM1qNDxlGdkXqe1L8Ub0x
  \nIKvywHeCbjdySMoSC2+6fYxqnhVlmxBhsOfdvW6SxuyUWpkMpY/Q4KekTCU7NPpQ
  \nF7hAypfuLYiEv/EJd0tSa6HLLQ10jP0042bqCJXWNmYF/zh1clGjlm3G96y89EjX
  \nVAGeFTGwUgzF5WQCMFa9wx+8Ch1zEAxLREoQmbIkFCSs
  \n-----END CERTIFICATE-----\n"
}

I'm trying to decode the token generated with my private key and my google service account email but it's returning the error below:

"$keyMaterial must be a string, resource, or OpenSSLAsymmetricKey"

Am I missing something? I've read some others answers and I have checked server time and it's ok so I couldn't find what's wrong.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文