【发布时间】:2017-02-18 01:36:16
【问题描述】:
我正在通过 App Engine 使用 Google Cloud PHP API。从客户端设备通过 POST 发送带有 Firebase 身份验证令牌的请求。根据 Firebase PHP JWT 的文档,我正在尝试使用以下代码解码令牌:
$decoded = JWT::decode($token, $key, array('RS256'));
$token 是这样的一行(出于安全原因,这是无效的):
eyJhbGciOiJSUzI1asdaNiIsImtpZCI6Ijk2N2Q3NzQ4YmM5NTMTIzNzRhZWQasdasd3MzEyYzcwNjEyZTRlNTM4NmUifQ.tuaAsjdlkjvsdngeoijAnlnbfgLkoosdfKLnm,werkldsfNkndfkdsnfkfnlNKL2i34nkNJioj4Kkoj234j%jij1kjojsdffds98giojerNNjasndasiNjasdnJAjnasdkjnFoFjoFJOIAASD8990adsaaDknnkngs.v_Ko6HZjrahbihLbw2Bm7EuslEC2SSHXNK79rDbD9qIIVYxPjCsubsdfkyAWDIoJHwjkM9TtssYS-1Cjd_xkXghfILuDZpzLsHV6rF20J4n3eUTrsnmLDHK6UB5N3yK2LYoF1UoFrsiyWenfqELfE4Gx5wlfmsylTS1foS2CWRrT1ccqmJBinWiY6JNUS-0gg-2Aecf_VJ63RD9308sBKy1DUsBeje9yG8w2YpYsAqKIlMTC-FqLLpHlKe4LZxcveiqSF4J6PgvcLSPTMmg7-Li_8m41O-wfU1zwSpS1SJ73RJNg-kvRZ1y1ll8ExqXjZkazRDVkYVo6yu5AXi1Onl6FqBLA
通过 JWT.io 检查令牌会给我一个正确的有效载荷。
现在是 $key 部分。我已经从 Google API 控制台下载了默认服务帐户 JSON 文件。如果我使用看起来像这样的“private_key”:
-----BEGIN PRIVATE KEY-----\n[VERY_LONG_PRIVATE_KEY]\n-----END PRIVATE KEY-----\n
我收到此错误:
openssl_verify(): supplied key param cannot be coerced into a public key
我在 StackOverflow 上找到了一个答案,这可以用来将私钥转换为公钥:
$private_key = openssl_pkey_get_private($c->serviceAccount->private_key);
$details = openssl_pkey_get_details($private_key);
$public_key = $details['key']
因此,如果我改用 $public_key,则会收到另一个错误,说明如下:
Uncaught exception 'DomainException' with message 'OpenSSL unable to verify data: error:0906D06C:PEM routines:PEM_read_bio:no start line
公钥如下:
-----BEGIN PUBLIC KEY-----\n[VERY_LONG_KEY]\n-----END PUBLIC KEY-----\n
所以看起来它应该可以工作。但事实并非如此。 RS256算法也是正确的。
任何帮助表示赞赏!
【问题讨论】:
标签: php firebase jwt firebase-authentication