隨著互聯網的發展,web應用的用戶量逐漸增多,安全問題也成為了越來越重要的問題。身份驗證是web應用安全的重要組成部分,因為只有經過身份驗證的用戶才能訪問需要權限的資源。
json Web Token (JWT) 是一種輕便、自包含的認證 token,是在 Web 應用間安全地傳輸信息的好方法。JWT 認證方案適用于分布式系統和單頁應用。
Thinkphp是一個流行的PHP框架,它提供了許多工具來開發安全的Web應用程序。在本文中,我們將介紹如何在thinkphp6中使用JWT進行身份驗證以增強應用程序的安全性。
開發環境和依賴
在開始之前,我們需要確保開發環境已經正確設置。以下是本文所使用的環境和依賴。請根據您的需求進行相應地更改。
立即學習“PHP免費學習筆記(深入)”;
- PHP 7.2 或更高版本
- ThinkPHP 6.0.0 或更高版本
- Firebase JWT PHP 庫
步驟1:安裝 Firebase JWT PHP 庫
安裝 Firebase JWT PHP 庫是使用 JWT 身份驗證方案的第一步。該庫將幫助我們創建、簽名和驗證 JWT。
我們可以使用 composer 安裝 Firebase JWT PHP 庫。 在命令行中輸入以下命令:
composer require firebase/php-jwt
步驟2:創建Token類
為了便于管理和使用 JWT,我們創建一個名為Token的類來處理 JWT 驗證的各個方面。這個類將包括創建令牌,驗證令牌,獲取令牌信息等功能。
在 app/common 目錄下創建 Token.php 文件,并添加以下代碼:
<?php namespace appcommon; use FirebaseJWTJWT; class Token { private static $key = 'your_secret_key'; private static $alg = 'HS256'; public static function createToken($data, $expiration = 3600) { $payload = [ 'iss' => 'localhost', 'sub' => 'token', 'iat' => time(), 'exp' => time() + $expiration, 'data' => $data ]; return JWT::encode($payload, self::$key, self::$alg); } public static function decodeToken($token) { return JWT::decode($token, self::$key, [self::$alg]); } public static function getDataByToken($token) { $decoded = self::decodeToken($token); if (isset($decoded->data)) { return $decoded->data; } else { return false; } } public static function verifyToken($token) { $result = false; try { $decoded = self::decodeToken($token); $result = true; } catch (Exception $e) { // Invalid token } return $result; } }
在代碼中,我們使用FirebaseJWTJWT庫中的encode()和decode()方法來創建和解析 JWT。$key是我們用于簽名 JWT 的密鑰,$alg是我們選擇的算法。 在createToken()方法中,我們使用 JWT 負載中的四個鍵(iss,iat,exp和sub)并添加自定義data。$expiration參數指定 JWT 的過期時間。因此,JWT 只能在有效期內使用。
步驟3:在中間件中驗證令牌
現在我們已經創建了 Token 類以處理 JWT 相關的工作,我們需要在中間件中驗證用戶 JWT。使用中間件可以方便地在應用程序的控制器代碼中攔截和設置響應,并且可以將代碼分離到不同的類中以便更好地管理和修改。
在 app/middleware 目錄下創建Jwt.php文件,并添加以下代碼:
<?php namespace appmiddleware; use appcommonToken; use thinkexceptionHttpResponseException; use thinkResponse; class Jwt { public function handle($request, Closure $next) { if (!$request->header('Authorization')) { return json(['code' => 401, 'msg' => 'Unauthorized']); } $header = $request->header('Authorization'); $token = substr($header, 7); if (Token::verifyToken($token)) { $request->data = Token::getDataByToken($token); return $next($request); } else { return json(['code' => 401, 'msg' => 'Unauthorized']); } } }
在此中間件中,我們使用 Token 類中的verifyToken()方法來驗證 JWT。 此方法將返回 true 或 false,表示令牌是否有效。 如果有效,我們將使用getDataByToken()方法來獲取 JWT 的數據部分并將其存儲在$request->data中。 這樣,控制器就可以使用此數據。
步驟4:設置路由
現在,我們已經創建了中間件,我們需要將其應用到適當的路由上。
假設我們要保護/api/user的路由,我們需要在routepi.php文件中按如下方式設置路由:
use appmiddlewareJwt; Route::group('api', function() { Route::get('user', 'UserController@getUserInfo')->middleware(Jwt::class); });
請注意,在此路由中,我們將Jwt中間件作為參數傳遞給middleware()方法。這是UserController中的getUserInfo()方法的示例代碼。
<?php namespace appcontroller; use appcommonToken; class UserController { public function getUserInfo() { $data = request()->data; ... } ... }
在控制器中,您可以通過調用$request->data來訪問經過身份驗證的 JWT 中存儲的數據。
結論
JWT 身份驗證方法可以使您的 Web 應用程序更安全和可靠。在本文中,我們介紹了如何在ThinkPHP6中使用 Firebase JWT PHP 庫來創建和驗證 JWT。
我們創建了一個名為 Token 的類,該類用于處理 JWT 相關的工作,并且添加了一個用于驗證 JWT 并設置數據的中間件。最后,我們設置了使用此中間件的路由和控制器代碼以訪問存儲在 JWT 中的數據。
引入 JWT 身份驗證的主要目的是確保應用程序中的資源只能被經過身份驗證的用戶使用。希望本文能夠幫助您了解如何使用 JWT 身份驗證來保護您的應用程序!