验证jwt

时间:2017-09-05 03:16:59

标签: php json jwt

我正在试验jwt,我在php做了一个非常简单的问题,然后转到jwt.io调试器验证它,并且头部和有效负载被正确解码,但是它说签名未经证实。我查看了this SO questioncopied 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 =

1 个答案:

答案 0 :(得分:1)

您链接的代码不正确。标头和有效负载是base64编码的,但它应该是 base64 url​​encoded 。见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);