我正在试验jwt
,我在php
做了一个非常简单的问题,然后转到jwt.io调试器验证它,并且头部和有效负载被正确解码,但是它说签名未经证实。我查看了this SO question和copied this article's code exactly,无法使用任何密钥进行验证。我尝试更改字符串我设置了我的密钥,选择并取消选中该框,我无法获得任何验证。这是我的代码:
$key = "mySecret";
$header = ["typ"=>"JWT","alg"=>"HS256"];
$header = base64_encode(json_encode($header));
$payload = ["valid"=>"true","isAdmin"=>"false"];
$payload = base64_encode(json_encode($payload));
$signature = hash_hmac('sha256','$header.$payload', $key, true);
$signature = base64_encode($signature);
$token = "$header.$payload.$signature";
echo $token;
我错过了什么步骤?
JWT
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ2YWxpZCI6InRydWUiLCJpc0FkbWluIjoiZmFsc2UifQ ==。QzjPt33UOjEPdPLtyhvs4DYrAD2TnQgv8P0WuHXuj / C =
答案 0 :(得分:1)
您链接的代码不正确。标头和有效负载是base64编码的,但它应该是 base64 urlencoded 。见RFC7519
JWT表示为由...分隔的URL安全部分序列 句号('。')字符。每个部分都包含base64url编码 值。
尝试在base64_encode
documentation中添加此评论提供的评论功能。请注意,SO问题也在使用它
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
$header = base64url_encode(json_encode($header));
$payload = base64url_encode(json_encode($payload));
$signature = base64url_encode($signature);