在 Web 開發中,最常見的需求之一就是使用者身份驗證。為了實現安全的身份驗證,Web 開發者可以依賴許多不同的機制。其中一種很受歡迎的方法是 JSON Web Tokens(JWT),它提供了一種基於令牌的身份驗證方法。
在本文中,我們將介紹 JWT 的基本概念,然後示範如何在 PHP 中使用 JWT 進行驗證。我們將使用一個簡單的範例 API 來說明。
JWT 是一個開放式標準(RFC 7519),它定義了一種基於JSON 格式的令牌協議,用於在服務端和客戶端之間傳輸訊息。 JWT 由三個部分組成:頭部、負載和簽名。
頭部包含了令牌的元數據,例如令牌類型和簽名演算法。負載包含了要傳輸的資料。 JWT 的傳輸是透過 Base64 編碼的。簽章部分則是對頭部和負載的雜湊值進行簽章。
在實際應用程式中,我們通常會在使用者登入成功後產生一個 JWT,然後將其發送回客戶端。客戶端每次存取受保護的 API 時,都需要將 JWT 作為身分驗證資訊傳送到服務端。服務端可以對 JWT 的有效性進行驗證,並基於其驗證使用者身份。
下面我們來示範如何在 PHP 中使用 JWT 進行身份驗證。在本範例中,我們將建立一個簡單的 API 來驗證 JWT。 API 將接受 GET 請求,並將 JWT 作為查詢參數傳遞。
首先,我們需要安裝 php-jwt 函式庫。我們可以使用Composer 來完成引入:
composer require firebase/php-jwt
然後,我們需要寫一個函數,將負載資料轉換為JWT 並簽署它:
function generateToken($payload) { $key = "secret_key"; $token = array( "iss" => "http://example.org", "aud" => "http://example.com", "iat" => time(), "exp" => time() + (60*60), "data" => $payload ); return JWT::encode($token, $key); }
在這個函數中,我們設定了一些基本的元數據,例如"iss"(頒發者)、"aud"(接收者)、"iat"(簽發時間)和"exp"(過期時間)。我們也將用戶資料新增至 JWT 的資料部分。最後,我們使用 PHP-JWT 函式庫的 encode 方法對 JWT 進行簽名,並使用 "secret_key" 作為簽名金鑰。
接下來,我們需要寫一個驗證函數,以檢查傳入的JWT 是否有效:
function validateToken($jwt) { $key = "secret_key"; try { $data = JWT::decode($jwt, $key, array('HS256')); return true; } catch (Exception $e) { return false; } }
在這個函數中,我們使用PHP-JWT 庫的decode 方法解碼JWT,並使用相同的金鑰進行驗證。如果 JWT 驗證通過,則傳回 true,否則傳回 false。
最後,我們需要寫一個入口腳本來接收GET 請求,並驗證JWT:
require_once 'vendor/autoload.php'; use FirebaseJWTJWT; $jwt = $_GET['jwt']; if (validateToken($jwt)) { $data = JWT::decode($jwt, "secret_key", array('HS256')); echo "Welcome " . $data->data->username . "!"; } else { echo "Invalid token!"; }
在這個腳本中,我們先從GET 請求參數中取得JWT,然後呼叫validateToken 函數以檢驗JWT 是否有效。如果 JWT 有效,我們可以解碼它,並從中提取我們儲存的用戶訊息,然後歡迎用戶。否則,我們將輸出 "Invalid token!"。
完整程式碼如下:
require_once 'vendor/autoload.php'; use FirebaseJWTJWT; function generateToken($payload) { $key = "secret_key"; $token = array( "iss" => "http://example.org", "aud" => "http://example.com", "iat" => time(), "exp" => time() + (60*60), "data" => $payload ); return JWT::encode($token, $key); } function validateToken($jwt) { $key = "secret_key"; try { $data = JWT::decode($jwt, $key, array('HS256')); return true; } catch (Exception $e) { return false; } } $jwt = $_GET['jwt']; if (validateToken($jwt)) { $data = JWT::decode($jwt, "secret_key", array('HS256')); echo "Welcome " . $data->data->username . "!"; } else { echo "Invalid token!"; }
#本文介紹如何在 PHP 中使用 JWT 進行驗證。我們基於一個簡單的 API 對 JWT 進行了演示,詳細介紹如何產生和驗證 JWT。
使用 JWT 進行身份驗證的關鍵點在於正確設定 JWT 的元資料和使用正確的簽章演算法。此外,應始終使用安全的金鑰來對 JWT 進行簽署。
因此,在開發應用程式時,您應該仔細考慮如何使用 JWT,以確保您的應用程式是安全的。
以上是使用JWT在PHP API介面中進行身份驗證的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!