JWT(JSON Web Token)是一種用于跨域認證的規范,通過在用戶請求中嵌入Token,可實現無狀態的分布式應用認證。在PHP語言中,我們可以簡單實現JWT的生成與校驗,下面是具體的使用方法。
生成JWT Token
下面是生成JWT的簡單代碼:
function createJWT($payload, $secret) { $header = base64_encode(json_encode(array( 'alg' =>'HS256', 'typ' =>'JWT' ))); $payload = base64_encode(json_encode($payload)); $signature = hash_hmac('sha256', "$header.$payload", $secret, true); $signature = base64_encode($signature); return "$header.$payload.$signature"; } $payload = array( 'sub' =>1234567890, 'name' =>'John Doe', 'iat' =>1516239022 ); $secret = 'secret'; $jwt = createJWT($payload, $secret);
其中$payload是存儲在Token中的數據,$secret是簽名所用的密鑰。以上代碼基于HS256算法,一般使用SHA-256加密方法,其中header、payload和signature構成JWT Token。
驗證JWT Token
下面是JWT Token的校驗方法:
function verifyJWT($jwt, $secret) { $jwt = explode('.', $jwt); if (count($jwt) != 3) { return false; } $header = json_decode(base64_decode($jwt[0]), true); $payload = json_decode(base64_decode($jwt[1]), true); $signature = $jwt[2]; if (!$header || !$payload || !$signature) { return false; } if (hash_hmac('sha256', "$jwt[0].$jwt[1]", $secret, true) !== base64_decode($signature)) { return false; } return $payload; } $payload = verifyJWT($jwt, $secret);
以上代碼中,$jwt是待驗證的JWT Token,$secret是簽名所用的密鑰。驗證時,將Token分解為header、payload和signature三部分,根據header和payload、密鑰重新生成signature并與原有signature進行比對,如果一致,則驗證通過。
使用JWT Token
生成JWT Token后,我們可以將其附加在HTTP請求中作為認證憑證,以下是一個簡單的例子:
function requestAPI($url, $jwt) { $curl = curl_init($url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, array( "Authorization: Bearer $jwt", "Content-Type: application/json" )); $response = curl_exec($curl); curl_close($curl); return $response; } $url = 'https://example.com/api'; $data = json_encode(array('foo' =>'bar')); $jwt = createJWT($payload, $secret); $response = requestAPI($url, $jwt);
以上代碼中,我們通過調用requestAPI函數向目標API發起請求,其中以"Authorization: Bearer $jwt"的形式將JWT Token附加在HTTP頭部中,作為認證憑證。這樣,服務器端就可以通過解析JWT Token獲取用戶身份信息。
總結
JWT是一種用于跨域認證的規范,通過在用戶請求中嵌入Token,可實現無狀態的分布式應用認證。在PHP語言中,我們可以簡單實現JWT的生成與校驗,并將其附加在HTTP請求中作為認證憑證。這樣一來,我們就可以實現基于JWT的無狀態認證,提高了應用的可擴展性和安全性。