2017-08-16 24 views
0

PHP JWT無効な署名

function base64url_encode($data) { 
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); 
} 

$key = 'secret'; 

//setting the header: 'alg' => 'HS256' indicates that this token is signed using HMAC-SHA256 
$header = array(
    'alg' => 'HS256', 
    'typ' => 'JWT' 
); 

// Returns the JSON representation of the header 
$header = json_encode($header); 

//encodes the $header with base64. 
$header = base64url_encode($header); 

$payload = array("a" => "b"); 

$payload = json_encode($payload);  
$payload = base64url_encode($payload); 

$signature = hash_hmac('SHA256','$header.$payload', $key, true); 
$signature = base64url_encode($signature); 

echo "$header.$payload.$signature"; 

は、次のJWTを返します:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhIjoiYiJ9.rhCKIvkwiuNcchxDZnGak8XT1q8lmLhnm8aIxzUioWg 

をしかし、署名は、ペイロードが復号化されhttps://jwt.io/ で検証されていないだけでなく...何がかもしれないが問題なの?

答えて

0

二重引用符ではなく、HMACを計算するときは、一重引用符を$header.payloadとしています。前者はリテラル文字列を使用し、変数を展開しません。

$signature = hash_hmac('SHA256', "$header.$payload", $key, true); 
+0

うわー、それは速かった!ありがとうございました!基本的なPHPの知識私は推測するが、私はJSから来る:( –