首頁 php框架 ThinkPHP 在ThinkPHP6中使用JWT驗證

在ThinkPHP6中使用JWT驗證

Jun 20, 2023 pm 11:36 PM
thinkphp 程式設計 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1602
29
PHP教程
1505
276
VSCODE設置。 JSON位置 VSCODE設置。 JSON位置 Aug 01, 2025 am 06:12 AM

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

Python Itertools組合示例 Python Itertools組合示例 Jul 31, 2025 am 09:53 AM

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

數據工程ETL的Python 數據工程ETL的Python Aug 02, 2025 am 08:48 AM

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

CSS下拉菜單示例 CSS下拉菜單示例 Jul 30, 2025 am 05:36 AM

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

鍵盤上的音量鍵無法正常工作 鍵盤上的音量鍵無法正常工作 Aug 05, 2025 pm 01:54 PM

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

以身作則http中間件記錄示例 以身作則http中間件記錄示例 Aug 03, 2025 am 11:35 AM

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

Google Chrome無法打開本地文件 Google Chrome無法打開本地文件 Aug 01, 2025 am 05:24 AM

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

Python Pytest夾具示例 Python Pytest夾具示例 Jul 31, 2025 am 09:35 AM

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

See all articles