現在的網站和服務中,很多都要涉及到用戶認證和授權的問題。如何保證用戶的信息不被黑客獲取,又如何確保一個請求是可靠的呢?在這時,JWT(JSON Web Token)就可以派上用場了。
JWT 是一種基于 JSON 格式的輕量級的身份認證協議。在用戶登錄的時候,服務器會簽發一個 JWT 給客戶端,客戶端將其存儲下來。之后客戶端在每一次向服務器發送請求時,都會攜帶 JWT。如果 JWT 驗證通過,服務器就可以根據 JWT 中的信息,判斷這個請求是來自認證過的用戶,并且對其請求進行相應的處理。
要使用 JWT 需要安裝一個 PHP 庫,我們這里選擇示例中較常用的 firebase/php-jwt 庫,這個庫不僅支持生成 JWT 還支持解析 JWT。首先在 composer.json 文件中添加庫的信息:
"firebase/php-jwt": "^5.0"
然后執行composer install
命令進行安裝。
接下來,我們來看一個簡單的示例。假設我們有一個用戶系統,用戶能夠登錄和注銷。當用戶登錄后,服務器會使用 JWT 庫生成一個 JWT,然后返回給客戶端。客戶端在之后的每個請求都需要將這個 JWT 放在請求的 Header 中,如下所示:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9....
服務端需要對 JWT 進行驗證。JWT 自動生成后,可以使用一個 secret 進行簽名。用這個 secret 來驗證 JWT,可以保證 JWT 是由認證服務器簽發的。接下來是一個簡單的驗證例子:
// 驗證 JWT
use \Firebase\JWT\JWT;
$jwt = getJwtFromHeader();
try {
$decoded = JWT::decode($jwt, $secret, array('HS256'));
} catch (Exception $e) {
http_response_code(401);
exit;
}
// 執行請求操作
doRequest($decoded);
在這個例子中,我們先從請求的 Header 中獲取 JWT。之后使用 JWT 庫的 decode 方法對 JWT 進行驗證并解析出 JWT 中的信息。在解析成功后,我們可以使用 JWT 中的信息來進行接下來的操作了。
最后需要提醒的是,由于 JWT 中包含了用戶的身份信息,所以 JWT 需要加密傳輸。比如使用 HTTPS 協議來傳輸 JWT。另外,需要注意的是,JWT 中信息的安全性取決于密鑰的安全性。因此,生成 JWT 時需要使用強密鑰來保證信息的安全性。
總結一下,使用 JWT 可以方便我們完成用戶認證和授權的問題。通過 JWT 我們可以很方便地校驗用戶的身份,而不需要在每次請求時都進行一遍認證。另外,JWT 也可以很容易地在多個服務端中轉移。