使用 php-jwt 库解码 firebase 自定义令牌时出现 openssl_verify() 错误

Posted

技术标签:

【中文标题】使用 php-jwt 库解码 firebase 自定义令牌时出现 openssl_verify() 错误【英文标题】:openssl_verify() error while decoding firebase custom token using php-jwt library 【发布时间】:2016-11-14 12:24:13 【问题描述】:

我已按照建议 here 使用 php-jwt 库为 Firebase 上的自定义身份验证生成了 firebase 自定义令牌。

我试图使用同一库的 decode 函数解码生成的令牌。

这是我的代码。

我已使用以下行在我的配置文件中定义了私钥。 define("FIREBASE_PRIVATE_KEY","-----BEGIN PRIVATE KEY-----\nMY_VERY_VERY_LONG_KEY\n-----END PRIVATE KEY-----\n");

这是解码令牌的代码。

JWT::decode($token, FIREBASE_PRIVATE_KEY, array('RS256'));

此代码引发以下异常。

openssl_verify(): supplied key param cannot be coerced into a public key

当我使用 HS256 进行解码和编码时,一切正常。 但我必须使用 RS256,因为 Firebase 自定义令牌只需要使用 RS256 进行签名

任何人都可以提出解决方案吗?

【问题讨论】:

这可能与您将 私钥 提供给需要 公钥 的函数的事实有关。您如何将公钥提取到单独的变量/常量中并传递它,而不是私钥? @Mjh:你的意思是我必须从可用的私钥创建一个公钥。然后将该公钥发送到解码功能?我该怎么做? 【参考方案1】:

免责声明:未经测试,基于我所知道的(目前)。

openssl_verify 接受 public key 作为参数,根据文档。 您正在提供私钥

我会尝试从私钥中提取公钥,并在JWT::decode 方法中使用它。

如何从私人中提取公共?很简单:

define("FIREBASE_PRIVATE_KEY","-----BEGIN PRIVATE KEY-----\nMY_VERY_VERY_LONG_KEY\n-----END PRIVATE KEY-----\n");

$private = openssl_pkey_get_private(FIREBASE_PRIVATE_KEY);
$details = openssl_pkey_get_details($private);

// Here's your public key, it's presented as a string, not a resource
$public = $details['key'];

【讨论】:

以上是关于使用 php-jwt 库解码 firebase 自定义令牌时出现 openssl_verify() 错误的主要内容,如果未能解决你的问题,请参考以下文章

找不到类 Firebase\JWT\JWT

Firebase php-jwt 令牌刷新

laravel firebase/php-jwt token验证

laravel firebase/php-jwt token验证

php firebase/php-jwt token验证

谷歌 OAuth JWT 签名验证