验证 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 url​​encoded。见RFC7519

JWT 表示为 URL 安全部分的序列,由 句点 ('.') 字符。每个部分都包含一个 base64url 编码的 价值。

尝试在base64_encodedocumentation 中添加此功能作为评论提供。请注意,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 的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何验证或验证 JWT 签名?

Jwt 身份验证问题 - 凭据无效

Wordpress JWT 身份验证令牌问题

使用 PyJWT 的 Jwt 解码引发签名验证失败

身份验证:JWT 使用与会话

JAVA 中的 JWT 身份验证。