隨著網絡的發展,用戶的登錄認證過程變得越來越重要,常見的登錄方式有用戶名密碼、短信驗證碼等。然而,隨著互聯網應用的發展,需要越來越多的應用來支持web api,傳統的登錄方式已經不再適用。JWT就是為滿足這種需求而生的解決方案。
JWT全稱JSON Web Token,是一個開放標準( RFC 7519 ),它定義了一種緊湊、自包含的格式用于通信過程中在雙方之間以Json對象交換信息。JWT可以通過三個部分來進行描述:頭部、負載、簽名。其中,頭部代表JWT使用的加密算法,負載用于存放用戶信息,簽名用于校驗JWT的合法性。
在PHP中,我們可以通過jwt.io提供的開源包 "jwt-php/jwt" 來實現JWT的生成與驗證:
require_once(__DIR__.DIRECTORY_SEPARATOR.'jwt' . DIRECTORY_SEPARATOR . 'JWT.php'); //生成JWT $payload = array( "user_id" =>1001, "username" =>"admin" ); $jwt = JWT::encode($payload, $secretKey, 'HS256'); //驗證JWT try { $decoded = JWT::decode($jwt, $secretKey, array('HS256')); $user_id = $decoded->user_id; $username = $decoded->username; } catch (Exception $e) { //拋出異常 }
在上面的代碼中,我們使用encode方法生成JWT,使用decode方法來驗證JWT。其中,$secretKey是自定義的密鑰,'HS256'代表使用HMAC SHA256算法對JWT進行簽名驗證。在生成JWT的過程中,我們將需要存儲的用戶信息存放到$payload數組中,然后通過encode方法即可生成JWT。在驗證JWT的過程中,我們首先需要使用decode方法來解碼JWT,然后通過得到的$decoded對象來獲取用戶信息。
當用戶登錄成功后,一般情況下需要將JWT保存到客戶端,以便將來的請求中可以使用該JWT來通過身份驗證。我們一般使用Cookie或者LocalStorage來保存JWT信息。在后續的API請求中,需要在請求頭(Header)中添加Authorization字段,該字段的值為"Bearer [JWT]"(其中,"[JWT]"是我們保存在客戶端的JWT)。服務端可以通過解析請求頭中的Authorization字段來獲取用戶的身份信息。
下面,我們演示如何驗證客戶端請求頭中的Authorization字段:
$token = ""; if (isset($_SERVER['HTTP_AUTHORIZATION'])) { $authHeader = $_SERVER['HTTP_AUTHORIZATION']; $token = trim(preg_replace('/^(?:\s+)?Bearer\s/', '', $authHeader)); } else if(isset($_SERVER['HTTP_TOKEN'])) { $token = $_SERVER['HTTP_TOKEN']; } try { $decoded = JWT::decode($token, $secretKey, array('HS256')); //驗證成功 } catch (Exception $e) { //驗證失敗 }
在上述代碼中,我們首先獲取請求頭中的Authorization字段,然后通過正則表達式來匹配JWT,最后將匹配到的JWT進行解析。如果JWT解析成功,則說明Authorization字段是有效的,否則就說明Authorization字段是無效的。這樣,我們就可以在API操作中通過Authorization字段來驗證用戶身份了。
總之,使用JWT是非常簡單的。通過JWT,我們可以輕松地在API操作中完成用戶身份驗證,從而更加安全地保護系統中的敏感數據。接下來,我們可以在web應用中廣泛地使用JWT,并結合一些常見的OAuth2.0協議實現更加高效的API接口。