2016-08-19 11 views
0

トークンベースの認証を開始し、JWTを作成するための非常に単純なPHPスクリプトを作成しました。しかし、jwt.ioのデバッガで実行すると、署名は決して検証されません。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が署名を検証していないのか分かりません。

答えて

2

この問題は、JWT実装を初めて書いたときに大きな頭痛を与えました。そのトリックは、署名を作成するキー付きハッシュが生のバイナリデータを出力する必要がありますが、デフォルト設定のhash_hmacはそうではありません。

あなたからあなたの署名を生成する方法を変更:

のraw_output:TRUEに設定すると、生の出力の最後のパラメータin the manualに関する情報を参照してください

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

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

バイナリデータ。 FALSE出力 小文字の桁数

+0

ありがとうございました!それは今動作し、私の署名はすべて検証されます。とても有難い。 – Ilmiont

+0

@Ilmiontハッピーコーディング* <帽子の先端> * – BeetleJuice

関連する問題