PHP是全球最流行的Web編程語言之一,能夠處理數據與數字并將其轉換為HTML內容。它成為了許多網站和應用程序的基礎。在今天的世界中,安全問題越來越嚴峻,因此開發者必須考慮我們網站和應用程序的安全性。其中最重要的一項是使用JWT(JSON Web Token)認證。
JWT是一個屬于Web的開放標準(RFC 7519),旨在定義一種安全方式,通過JSON(JavaScript Object Notation)將信息從一方傳遞到另一方。JWT由三部分組成:Header,Payload 和 Signature。頭部包含聲明類型(即JWT)和所使用的算法。負載包含所聲明的任何關鍵信息。簽名是JWT的第三部分,這個部分由算法和所進行的哈希結果構成。
Header.Payload.Signature // 示例 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4 gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWT有多種使用方式,最常見的一種就是作為API身份驗證手段。用戶登錄后可向服務器請求令牌,服務器則使用JWT生成一個token,用于驗證用戶身份,由于token只有在必要時才需要連接到數據庫進行驗證,因此對于服務器性能優化和降低數據庫負擔大有裨益。
我們來看下如何在PHP中使用JWT,使用PHP的官方包如下所示。
use Firebase\JWT\JWT; $jwt = JWT::encode(['id' =>1], 'secretkey'); $decoded = JWT::decode($jwt, 'secretkey', ['HS256']); print_r($decoded);
上述例子中的encode()方法需要兩個參數:消息和密鑰。decode()方法需要三個參數:JWT,密鑰和預期使用的算法。
如果您需要通過多個請求使用JWT,則可能需要擴展其有效期。如下所示:
use Firebase\JWT\JWT; // 將jwt有效期延長至3小時 $jwt = JWT::encode(['id' =>1], 'secretkey', 'HS256', 60 * 180); $decoded = JWT::decode($jwt, 'secretkey', ['HS256']); print_r($decoded);
假設您的應用程序使用SQLite存儲用戶,并使用username作為用戶表的每個行的主鍵。您可以使用下面的JWT代碼來生成一個token并將其保存到會話中。
use Firebase\JWT\JWT; if ($_POST['username'] === 'john') { $_SESSION['user'] = JWT::encode(['username' =>'john'], 'secretkey'); };
下面的代碼演示如何在用戶注銷時刪除token。
unset($_SESSION['user']);
在API中使用JWT認證時,客戶端發出請求時通常需要在請求頭中設置包含JWT的Authorization頭。如下所示:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0N TY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4f wpMeJf36POk6yJV_adQssw5c
以上就是PHP JWT實現的基本流程和方法,我們開發者需要根據自己的需要進一步拓展使用,為我們的應用程序和API提供強大的安全支持。同時也應注意安全的使用方式,否則會帶來可步人后臺的漏洞問題。