验证 jwt 的问题
Posted
技术标签:
【中文标题】验证 jwt 的问题【英文标题】:Issue with validating jwt 【发布时间】:2018-02-13 05:59:08 【问题描述】:我正在尝试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=
【问题讨论】:
你能发布一个示例令牌吗? @pedrofb 已编辑以包含以上内容 【参考方案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);
【讨论】:
谢谢!这是两个问题......这绝对是一个大问题,而且,当将$header.$payload
散列到签名中时,我使用单引号而不是双引号,所以我将它们更改为双引号,并结合 base64url_encode,它工作!以上是关于验证 jwt 的问题的主要内容,如果未能解决你的问题,请参考以下文章