一、JWT簡介
JSON Web Token (JWT)是一種基於JSON格式的輕量級令牌規範,用於在網路應用中傳遞聲明。JWT規範允許對JSON數據進行數字簽名,以便驗證數據的完整性和真實性。由於它是通過數字簽名來實現驗證的,因此不需要進行資料庫查詢,可以大大降低伺服器的負載。
它由三個部分組成:Header 頭部、Payload 負載、Signature 簽名。一個完整的JWT Token如下圖所示:
<Header>.<Payload>.<Signature>
二、JWT加密解密代碼示例 – PHP
在PHP中,官方已經提供了firebase/php-jwt庫來實現JWT的編碼和解碼。示例如下:
1. 安裝php-jwt庫
composer require firebase/php-jwt
2. 編碼生成JWT Token
在生成JWT Token之前,需要先定義Header和Payload。Header一般是固定的,示例代碼如下:
$header = array( "alg" => "HS256", "typ" => "JWT" );
Payload一般包含用戶的ID、名稱等信息,也可以自定義一些數據。示例代碼如下:
$payload = array( "user_id" => 123456, "username" => "John Smith", "email" => "john.smith@abc.com" );
將Header和Payload使用base64編碼,拼接在一起,並使用HS256演算法進行簽名,即可生成JWT Token。示例代碼如下:
use \Firebase\JWT\JWT; $key = "secret_key"; $jwt = JWT::encode($payload, $key, "HS256");
3. 解碼驗證JWT Token
驗證JWT Token的合法性包括兩個方面:1. 驗證簽名是否正確;2. 驗證JWT Token是否過期。示例代碼如下:
$key = "secret_key"; try { $decoded = JWT::decode($jwt, $key, array('HS256')); } catch (Exception $e) { // Invalid token }
三、JMeter加密解密代碼示例
JMeter是一款非常流行的開源壓測工具。在執行壓測場景時,有時需要在HTTP請求頭中添加JWT Token以驗證用戶身份。這時我們需要使用JMeter的JSR223 Sampler來實現JWT的編碼和解碼。示例代碼如下:
1. 添加JSR223 Sampler
在JMeter的測試計劃中添加一個JSR223 Sampler,並選擇語言為Groovy。
2. 編寫Groovy腳本
在JSR223 Sampler中編寫Groovy腳本,示例代碼如下:
import io.jsonwebtoken.*; def key = "secret_key"; def payload = ['user_id': '123456', 'username': 'John Smith', 'email': 'john.smith@abc.com']; def token = Jwts.builder().setClaims(payload).signWith(SignatureAlgorithm.HS256, key.getBytes()).compact(); vars.put("jwt_token", token); // 將生成的JWT Token保存到JMeter變數中
3. 在HTTP請求頭中添加JWT Token
在發送HTTP請求時,在請求頭中添加Authorization欄位,並將JWT Token添加到欄位值中。欄位值的格式為”Bearer {jwt_token}”,示例代碼如下:
Authorization: Bearer ${jwt_token}
四、JWT解密代碼示例
在某些情況下,我們需要解密JWT Token以查看其中包含的數據。解密JWT Token需要使用相應的密鑰和演算法。示例代碼如下:
1. 安裝php-jwt庫
同2.1節中描述的方式安裝php-jwt庫。
2. 解密JWT Token
使用JWT::decode()函數解碼JWT Token,示例代碼如下:
use \Firebase\JWT\JWT; $key = "secret_key"; $decoded = JWT::decode($jwt, $key, array('HS256')); print_r($decoded);
3. 解密後的結果
解密後的結果為一個PHP對象,包含了JWT Token中的所有數據。示例代碼如下:
stdClass Object ( [user_id] => 123456 [username] => John Smith [email] => john.smith@abc.com [iat] => 1630616844 [exp] => 1630703244 )
五、小結
本文詳細介紹了JWT的基本概念、PHP和JMeter中的JWT編碼解碼實現和JWT解密的代碼示例。JWT不僅簡化了服務端存儲和查詢的複雜性,而且更安全和方便。通過本文的學習,相信讀者對JWT有了更深入的理解。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/291171.html