隨著網路的發展,Web應用的使用者量逐漸增多,安全問題也成為了越來越重要的議題。身份驗證是Web應用程式安全的重要組成部分,因為只有經過身份驗證的使用者才能存取需要權限的資源。
JSON Web Token (JWT) 是一種輕巧、自包含的認證 token,是在 Web 應用間安全地傳輸資訊的好方法。 JWT 認證方案適用於分散式系統和單頁應用。
ThinkPHP是一個流行的PHP框架,它提供了許多工具來開發安全的網路應用程式。在本文中,我們將介紹如何在ThinkPHP6中使用JWT進行身份驗證以增強應用程式的安全性。
開發環境和依賴
在開始之前,我們需要確保開發環境已經正確設定。以下是本文所使用的環境和依賴。請根據您的需求進行相應地更改。
#步驟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
的路由,我們需要在route pi.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 身份驗證來保護您的應用程式!
以上是在ThinkPHP6中使用JWT驗證的詳細內容。更多資訊請關注PHP中文網其他相關文章!