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

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

settings.json文件位於用戶級或工作區級路徑,用於自定義VSCode設置。 1.用戶級路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區級路徑:項目根目錄下的.vscode/settings

itertools.combinations用於生成從可迭代對像中選取指定數量元素的所有不重複組合(順序無關),其用法包括:1.從列表中選2個元素組合,如('A','B')、('A','C')等,避免重複順序;2.對字符串取3個字符組合,如"abc"、"abd",適用於子序列生成;3.求兩數之和等於目標值的組合,如1 5=6,簡化雙重循環邏輯;組合與排列的區別在於順序是否重要,combinations視AB與BA為相同,而permutations視為不同;

Python是實現ETL流程的高效工具,1.數據抽取:通過pandas、sqlalchemy、requests等庫可從數據庫、API、文件等來源提取數據;2.數據轉換:使用pandas進行清洗、類型轉換、關聯、聚合等操作,確保數據質量並優化性能;3.數據加載:利用pandas的to_sql方法或云平台SDK將數據寫入目標系統,注意寫入方式與批次處理;4.工具推薦:Airflow、Dagster、Prefect用於流程調度與管理,結合日誌報警與虛擬環境提升穩定性與可維護性。

是的,一個常見的CSS下拉菜單可以通過純HTML和CSS實現,無需JavaScript。 1.使用嵌套的ul和li構建菜單結構;2.通過:hover偽類控制下拉內容的顯示與隱藏;3.父級li設置position:relative,子菜單使用position:absolute進行定位;4.子菜單默認display:none,懸停時變為display:block;5.可通過嵌套實現多級下拉,結合transition添加淡入動畫,配合媒體查詢適配移動端,整個方案簡潔且無需JavaScript支持,適合大

First,checkiftheFnkeysettingisinterferingbytryingboththevolumekeyaloneandFn volumekey,thentoggleFnLockwithFn Escifavailable.2.EnterBIOS/UEFIduringbootandenablefunctionkeysordisableHotkeyModetoensurevolumekeysarerecognized.3.Updateorreinstallaudiodriv

Go中的HTTP日誌中間件可記錄請求方法、路徑、客戶端IP和耗時,1.使用http.HandlerFunc包裝處理器,2.在調用next.ServeHTTP前後記錄開始時間和結束時間,3.通過r.RemoteAddr和X-Forwarded-For頭獲取真實客戶端IP,4.利用log.Printf輸出請求日誌,5.將中間件應用於ServeMux實現全局日誌記錄,完整示例代碼已驗證可運行,適用於中小型項目起步,擴展建議包括捕獲狀態碼、支持JSON日誌和請求ID追踪。

ChromecanopenlocalfileslikeHTMLandPDFsbyusing"Openfile"ordraggingthemintothebrowser;ensuretheaddressstartswithfile:///;2.SecurityrestrictionsblockAJAX,localStorage,andcross-folderaccessonfile://;usealocalserverlikepython-mhttp.server8000tor

fixture是用於為測試提供預設環境或數據的函數,1.使用@pytest.fixture裝飾器定義fixture;2.在測試函數中以參數形式註入fixture;3.yield之前執行setup,之後執行teardown;4.通過scope參數控製作用域,如function、module等;5.將共用fixture放在conftest.py中實現跨文件共享,從而提升測試的可維護性和復用性。
