2016-08-19 129 views
0

我刚刚开始使用基于令牌的身份验证,并且已经编写了一个非常简单的PHP脚本来创建JWT。但是,当我在jwt.io的调试器中运行它时,签名从不验证。JWT签名不在PHP中验证

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; 

至于我可以告诉大家,我实现内联智威汤逊的格式。我错过了什么,或者我应该使用库例如php-jwt生成新的令牌并让它们验证?

对于我的使用,无论如何我的实现可能会正常工作,因为我仍然可以使用相同的代码验证令牌。但我只是不确定为什么jwt.io没有验证签名。

回答

2

当我第一次写我的JWT实现时,这个问题让我非常头痛。诀窍是创建签名的密钥散列必须输出原始二进制数据,但默认设置hash_hmac不是这样。

改变你的生成你的签名来自:

hash_hmac("sha256", $header . "." . $payload, $secret); 

hash_hmac("sha256", $header . "." . $payload, $secret, true); 

查看关于最后一个参数in the manual信息:

raw_output:当设置为TRUE,输出原二进制数据。 FALSE输出 小写六进制

+0

非常感谢!它现在可以工作,我所有的签名都会被验证。非常感激。 – Ilmiont

+0

@Imiont快乐编码* <帽尖> * – BeetleJuice