2016-08-19 128 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