无法解码JWT令牌PHP

3
我尝试使用以下代码解码给定的令牌。密钥应该是base64编码的。但是,当我尝试解码时,它告诉我签名无效。该令牌是由一个使用Java的系统生成的,我必须在PHP中对其进行解码。 令牌:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyZXN1bHQiOiJzdWNjZWVkZWQiLCJpc3MiOiJ4eXoubmUuanAiLCJwcm9maWxlSWRlbnRpZmllciI6IioqKioqKio0NTY3IiwiZXhwIjoxNTk3MjAxNzQyLCJub25jZSI6ImRlNTRlODE3YmQ4NjM4MTI5ZWQ2ZDkxNDA1YTkwMTUyYWIzNTE4N2NkYWMxMDIxNmQ5NWI5NmUzYjgyMjAxNTFhZmU0ZDE4NWZlMzYzNTExNWMwNDFhOWY4OTNjMGZmMGFmZjFkYzBjODgyMDhmMjEwN2ZlMzk5Mzg3ZDMzZGMyZTllY2E5ODA0NDNmZjJiNjZiZDM1ZDk1YjAzY2ExMjIiLCJyZWZlcmVuY2VJZCI6IlRFU1QxMjM1ZjMzNTc3MzBlYjcxIn0.fvEsTg6OcCx2iBPMP-7e9AZtEviDqAEfTMZJib7UVQg

解码脚本

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

选择 secret base64 encoded 选项后,可在jwt.io 上正常解码。我在这里做错了什么?

2个回答

5
当密钥已经是Base64编码时,您需要在将其传递给JWT :: decode 之前对其进行解码:

$ key = base64_decode(“testing1234453656347nsmvfdbsrtgjnfsjhNJFDJFujragrg”); 当选中“ secret base64 encoded”复选框时,这就是 JWT.io 正在执行的操作。
这实际上意味着:“输入字段中的秘密是Base64编码的,因此需要进行解码”。
我可以证实使用此密钥和“secret base64 encoded”选中可以验证令牌签名。

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

这通常与无关。JWT基于独立于语言的标准。

感谢帮助。我真的不想相信这一点,但我正在使用一个未经过Base64编码的字符串API进行工作。我的JWT密钥不会变成垃圾值吗?这是否是可以被解释器或编译器更改破坏的东西? - Ayaskant Mishra
我不太确定你在问什么。你问题中的秘密肯定不是真正的base64编码(如果这是你的意思),但对于base64来说,只要所有字符都是有效的base64字符,就没有关系了。而在HMAC-SHA256中的秘密本身也没有指定的格式,只是一堆位(不像RS256那样)。一切都很好,我看不出会有什么问题。 - jps

0
根据新的实施,您需要包含use \Firebase\JWT\Key;语句,并使用提供的参数与Key类的实例一起使用JWT::decode()方法,以有效地解码JWT令牌。
use \Firebase\JWT\JWT;
use \Firebase\JWT\Key;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接