PHP JWT 實例
JSON Web Token,簡稱 JWT,是一種開放標(biāo)準(zhǔn)(RFC 7519),用于在不同服務(wù)之間以安全方式傳輸信息。在本文中,我們將使用 PHP 語言和 PHP-JWT 庫來實現(xiàn)一個 JWT 應(yīng)用程序。下面是一些可能需要在我們探討 JWT 的應(yīng)用程序中經(jīng)常使用的術(shù)語:
$JWT = array( "iss" =>"https://example.com", // Issuer "aud" =>"https://example.com", // Audience "iat" =>1356999524, // Issued At "nbf" =>1357000000 // Not Before );
使用 JWT 簽署請求
假設(shè)我們有一個名為 user 的對象,他想從服務(wù)端獲取一些數(shù)據(jù)。我們需要發(fā)出一個 JWT 請求,并將簽署后的 JWT 附加到我們的 API 請求中。在 PHP 中,我們使用 firebase/php-jwt 庫來生成 JWT。
require_once 'php-jwt-master/src/BeforeValidException.php'; require_once 'php-jwt-master/src/ExpiredException.php'; require_once 'php-jwt-master/src/SignatureInvalidException.php'; require_once 'php-jwt-master/src/JWT.php'; use \Firebase\JWT\JWT; $secret_key = "example_key"; $issuer_claim = "https://example.com"; $audience_claim = "https://example.com"; $issuedat_claim = time(); $notbefore_claim = $issuedat_claim + 10; $expire_claim = $issuedat_claim + 60; $token = array( "iss" =>$issuer_claim, "aud" =>$audience_claim, "iat" =>$issuedat_claim, "nbf" =>$notbefore_claim, "exp" =>$expire_claim, "data" =>array( "id" =>$user['id'], "name" =>$user['name'], "email" =>$user['email'] ) ); http_response_code(200); $jwt = JWT::encode($token, $secret_key); echo json_encode( array( "message" =>"Successful login.", "jwt" =>$jwt, "email" =>$user['email'], "expireAt" =>$expire_claim ));
我們可以看到,我們設(shè)置了一些 JWT 的聲明,然后使用 "encode( )" 函數(shù)生成包含聲明和目標(biāo)用戶數(shù)據(jù)的 JWT。在加密 JWT 時,我們使用了我們在上面定義的 $secret_key。最后,我們返回一個響應(yīng),其中包含訪問令牌 (JWT)以及其他必要的用戶信息。用戶現(xiàn)在可以將 JWT 傳遞到其他服務(wù)中。
驗證 JWT
現(xiàn)在,假設(shè)我們的系統(tǒng)中有另一個服務(wù),名為 example.com。它想要驗證一個已簽署的 JWT,以確保它是有效的、沒有被篡改并且沒有過期。為此,我們將使用簽署 JWT 的密鑰對 JWT 進(jìn)行解碼。以下是一個解碼 JWT 的例子:
$jwt=JWT::decode($jwt, $secret_key, array('HS256')); http_response_code(200); echo json_encode(array( "message" =>"Successful Login.", "jwt" =>$jwt ));
我們首先使用 "decode( )" 函數(shù)解碼 JWT。我們通過 $secret_key 與計算的簽名進(jìn)行比較,并使用定義的簽名算法。如果這些都確認(rèn)了,我們就可以取出有用的任意數(shù)據(jù)并進(jìn)行進(jìn)一步的驗證。
結(jié)論
JSON Web Token(JWT)提供了一種安全、權(quán)威、輕量級的方法,使客戶端在服務(wù)之間安全地傳遞任意信息。在此,我們使用 php-jwt 庫和 PHP 語言,實現(xiàn)了 JWT 的簽署、解碼和驗證。JWT 更加有趣的部分是由應(yīng)用程序自行定義的,開發(fā)人員能夠使用其自由度來設(shè)計出屬于自己的最佳實踐。