有一些用于在PHP中实现JSON Web Tokens(JWT)的库,例如php-jwt。我正在编写自己的非常简单的类,但无法弄清楚为什么即使我尝试遵循标准,在此处(http://jwt.io/)进行签名验证时,我的签名仍然无法通过验证。我已经尝试了几小时,但是卡住了,请求帮助!
我的代码很简单
//build the headers
$headers = ['alg'=>'HS256','typ'=>'JWT'];
$headers_encoded = base64url_encode(json_encode($headers));
//build the payload
$payload = ['sub'=>'1234567890','name'=>'John Doe', 'admin'=>true];
$payload_encoded = base64url_encode(json_encode($payload));
//build the signature
$key = 'secret';
$signature = hash_hmac('SHA256',"$headers_encoded.$payload_encoded",$key);
//build and return the token
$token = "$headers_encoded.$payload_encoded.$signature";
echo $token;
base64url_encode
函数:
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
我的 JWT 头和负载与验证站点默认的 JWT 完全匹配,但是我的签名不匹配,因此我的令牌被标记为无效。这个标准似乎非常简单,那么我的签名有什么问题呢?