无法解码JWT令牌PHP



我试图用下面的代码解码给定的令牌。密钥应该是base64编码的。然而,当我试图解码它时,告诉我有无效的签名。令牌是从使用Java的系统中生成的,我必须用PHP对其进行解码。

代币:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyZXN1bHQiOiJzdWNjZWVkZWQiLCJpc3MiOiJ4eXoubmUuanAiLCJwcm9maWxlSWRlbnRpZmllciI6IioqKioqKio0NTY3IiwiZXhwIjoxNTk3MjAxNzQyLCJub25jZSI6ImRlNTRlODE3YmQ4NjM4MTI5ZWQ2ZDkxNDA1YTkwMTUyYWIzNTE4N2NkYWMxMDIxNmQ5NWI5NmUzYjgyMjAxNTFhZmU0ZDE4NWZlMzYzNTExNWMwNDFhOWY4OTNjMGZmMGFmZjFkYzBjODgyMDhmMjEwN2ZlMzk5Mzg3ZDMzZGMyZTllY2E5ODA0NDNmZjJiNjZiZDM1ZDk1YjAzY2ExMjIiLCJyZWZlcmVuY2VJZCI6IlRFU1QxMjM1ZjMzNTc3MzBlYjcxIn0.fvEsTg6OcCx2iBPMP-7e9AZtEviDqAEfTMZJib7UVQg

解码脚本

use FirebaseJWTJWT;
$encodedString = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyZXN1bHQiOiJzdWNjZWVkZWQiLCJpc3MiOiJ4eXoubmUuanAiLCJwcm9maWxlSWRlbnRpZmllciI6IioqKioqKio0NTY3IiwiZXhwIjoxNTk3MjAxNzQyLCJub25jZSI6ImRlNTRlODE3YmQ4NjM4MTI5ZWQ2ZDkxNDA1YTkwMTUyYWIzNTE4N2NkYWMxMDIxNmQ5NWI5NmUzYjgyMjAxNTFhZmU0ZDE4NWZlMzYzNTExNWMwNDFhOWY4OTNjMGZmMGFmZjFkYzBjODgyMDhmMjEwN2ZlMzk5Mzg3ZDMzZGMyZTllY2E5ODA0NDNmZjJiNjZiZDM1ZDk1YjAzY2ExMjIiLCJyZWZlcmVuY2VJZCI6IlRFU1QxMjM1ZjMzNTc3MzBlYjcxIn0.fvEsTg6OcCx2iBPMP-7e9AZtEviDqAEfTMZJib7UVQg";
$key = base64_encode("testing1234453656347nsmvfdbsrtgjnfsjhNJFDJFujragrg");
$decoded = JWT::decode($encodedString, $key, array('HS256'));

在选中secret base64 encoded选项的情况下,它在jwt.io上解码得很好。我在这里做错了什么?

当密钥已经进行Base64编码时,在将其传递给JWT::decode:之前,必须对其进行解码

$key = base64_decode("testing1234453656347nsmvfdbsrtgjnfsjhNJFDJFujragrg");

这就是JWT.io在选中复选框";secret base64编码";检查。

它的字面意思是:;输入字段中的秘密是base64编码的并且因此需要被解码";。

并且我可以确认令牌签名可以用这个秘密来验证;secret base64编码";已检查。

令牌是从使用Java的系统中生成的,我必须用PHP对其进行解码。

这通常应该无关紧要。JWT基于独立于语言的标准。

根据新的实现,您将需要包括use FirebaseJWTKey;语句,并使用带有所提供参数的JWT::decode()方法和Key类的实例,可以有效地解码JWT令牌。

use FirebaseJWTJWT;
use FirebaseJWTKey;
$encodedString = "";
$key = base64_decode("testing1234453656347nsmvfdbsrtgjnfsjhNJFDJFujragrg");
$decoded = JWT::decode($encodedString, new Key($key, 'HS256'));

最新更新