JWT签名未在PHP

时间:2016-08-19 19:12:00

标签: php security authentication token jwt

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

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没有验证签名。

1 个答案:

答案 0 :(得分:2)

当我第一次编写JWT实现时,这个问题让我头疼不已。诀窍是创建签名的键控哈希必须输出原始二进制数据,但默认设置hash_hmac不是。

更改您的签名来源:

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

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

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

  

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