JWT 签名未在 PHP 中验证
JWT signature not verifying in PHP
我刚刚开始使用基于令牌的身份验证,并且编写了一个非常简单的 PHP 脚本来创建 JWT。但是,当我在 jwt.io 的调试器中 运行 它时,签名永远不会验证。
$secret = "super_secure_private_key";
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), "+/", "-_"), "=");
}
$header = base64url_encode(json_encode([
"alg" => "HS256",
"typ" => "JWT"
]));
$payload = base64url_encode(json_encode([
"name" => "James Walker",
"privileges" => "total"
]));
$signature = base64url_encode(hash_hmac("sha256", $header . "." . $payload, $secret));
$token = $header . "." . $payload . "." . $signature;
据我所知,我的实现符合 JWT 的格式。我错过了什么,或者我应该使用图书馆,例如php-jwt 生成新令牌并验证它们?
对于我的使用,我的实现可能无论如何都可以正常工作,因为我仍然可以使用相同的代码自己验证令牌。但我只是不确定为什么 jwt.io 不验证签名。
当我第一次编写 JWT 实现时,这个问题让我非常头疼。诀窍是创建签名的键控哈希必须输出原始二进制数据,但 hash_hmac
的默认设置不是这样。
更改生成签名的方式:
hash_hmac("sha256", $header . "." . $payload, $secret);
到
hash_hmac("sha256", $header . "." . $payload, $secret, true);
查看关于最后一个参数的信息in the manual:
raw_output: When set to TRUE, outputs raw binary data. FALSE outputs
lowercase hexits
我刚刚开始使用基于令牌的身份验证,并且编写了一个非常简单的 PHP 脚本来创建 JWT。但是,当我在 jwt.io 的调试器中 运行 它时,签名永远不会验证。
$secret = "super_secure_private_key";
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), "+/", "-_"), "=");
}
$header = base64url_encode(json_encode([
"alg" => "HS256",
"typ" => "JWT"
]));
$payload = base64url_encode(json_encode([
"name" => "James Walker",
"privileges" => "total"
]));
$signature = base64url_encode(hash_hmac("sha256", $header . "." . $payload, $secret));
$token = $header . "." . $payload . "." . $signature;
据我所知,我的实现符合 JWT 的格式。我错过了什么,或者我应该使用图书馆,例如php-jwt 生成新令牌并验证它们?
对于我的使用,我的实现可能无论如何都可以正常工作,因为我仍然可以使用相同的代码自己验证令牌。但我只是不确定为什么 jwt.io 不验证签名。
当我第一次编写 JWT 实现时,这个问题让我非常头疼。诀窍是创建签名的键控哈希必须输出原始二进制数据,但 hash_hmac
的默认设置不是这样。
更改生成签名的方式:
hash_hmac("sha256", $header . "." . $payload, $secret);
到
hash_hmac("sha256", $header . "." . $payload, $secret, true);
查看关于最后一个参数的信息in the manual:
raw_output: When set to TRUE, outputs raw binary data. FALSE outputs lowercase hexits