JWT签名不在PHP中验证
问题描述:
我刚刚开始使用基于令牌的身份验证,并且已经编写了一个非常简单的PHP脚本来创建JWT。但是,当我在jwt.io的调试器中运行它时,签名从不验证。JWT签名不在PHP中验证
$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;
至于我可以告诉大家,我实现内联智威汤逊的格式。我错过了什么,或者我应该使用库例如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:当设置为TRUE,输出原二进制数据。 FALSE输出 小写六进制
非常感谢!它现在可以工作,我所有的签名都会被验证。非常感激。 – Ilmiont
@Imiont快乐编码* * – BeetleJuice