搜尋
首頁php框架ThinkPHP如何使用ThinkPHP6進行JWT認證?

如何使用ThinkPHP6進行JWT認證?

Jun 12, 2023 pm 12:18 PM
thinkphp認證jwt

JWT(JSON Web Token)是一種輕量級的認證和授權機制,它使用JSON物件作為安全令牌,可以在多個系統之間安全地傳輸使用者身分資訊。而ThinkPHP6是一種基於PHP語言的高效、靈活的MVC框架,它提供了許多有用的工具和功能,其中就包括JWT認證機制。在本文中,我們將介紹如何使用ThinkPHP6進行JWT認證,以確保Web應用程式的安全性和可靠性。

  1. 安裝和設定JWT擴充

首先,我們需要在我們的應用程式中安裝JWT擴充。可以透過在composer.json檔案中新增依賴項來安裝它:

{
    "require": {
        "firebase/php-jwt": "^5.0.0"
    }
}

然後執行以下命令安裝它:

composer install

安裝完成後,我們需要在設定檔中設定JWT。在config目錄下建立jwt.php文件,並加入以下內容:

<?php
return [
    'key' => 'your-secret-key',
    'alg' => 'HS256',
    'exp' => 7200, // token过期时间,单位秒
];

其中「key」是一個字串,用於產生JWT令牌的簽章金鑰,「alg」是JWT簽章演算法的名稱,我們可以選擇「HS256」、「HS512」、「RS256」等演算法,「exp」是JWT令牌的過期時間,以秒數計算。

  1. 實作JWT認證控制器

接下來,我們需要建立一個JWT認證控制器,實作JWT認證。在app/controller目錄下創建AuthController.php文件,並添加以下內容:

<?php
namespace appcontroller;

use FirebaseJWTJWT;
use thinkacadeDb;

class AuthController
{
    public function login()
    {
        //在这里处理用户登陆逻辑
        //...
        
        //登陆成功后生成JWT token并返回给客户端

        $secretKey = config('jwt.key'); // 获取JWT生成签名的密钥
        $alg = config('jwt.alg'); // 获取JWT加密算法
        $payload = [
            'sub' => $user->id, // 存储用户ID
            'exp' => time() + config('jwt.exp'), // 设定过期时间
        ];
        $jwt = JWT::encode($payload, $secretKey, $alg); // 生成JWT令牌
        return ['token' => $jwt]; // 返回JWT Token给客户端
    }

    public function dashboard()
    {
        //检查请求中的JWTToken是否有效,并返回用户信息

        $jwtToken = request()->header('Authorization'); // 获取JWT Token
        if (!$jwtToken) {
            // 如果token不存在,直接返回错误信息
            return ['msg' => '未验证身份,请先登录'];
        }
        $jwtInfo = JWT::decode($jwtToken, config('jwt.key'), [config('jwt.alg')]); // 使用JWT解密Token
        $userId = $jwtInfo->sub; // 获取token中存储的用户ID,用来查询用户信息
        $user = Db::table('users')->where('id', $userId)->find(); // 查询用户信息
        if (!$user) {
            // 用户不存在,直接返回错误信息
            return ['msg' => '用户不存在'];
        }
        // 返回用户信息
        return ['username' => $user['username'], 'email' => $user['email']];
    }
}

在上面的控制器程式碼中,我們實現了兩個功能:一個是用戶登陸,另一個是獲取用戶信息。在登陸過程中,我們產生了一個JWT令牌,並將其傳回給客戶端,用於後續請求中的身份驗證。在dashboard方法中,我們檢查了請求的Authorization頭中是否包含JWT令牌,並使用JWT解密令牌,以驗證使用者的身分是否有效。

  1. 新增JWT認證中間件

最後,我們需要在應用程式中新增一個JWT認證中介軟體,以保護需要認證的API介面。在app/middleware目錄中建立JwtAuth.php文件,並添加以下內容:

<?php
namespace appmiddleware;

use FirebaseJWTJWT;
use thinkacadeConfig;

class JwtAuth
{
    public function handle($request, Closure $next)
    {
        //检查请求中的JWTToken是否有效

        $jwtToken = $request->header('Authorization'); // 获取JWT Token
        if (!$jwtToken) {
            // 如果token不存在,直接返回错误信息
            return response(['msg' => '未授权的API请求!'], 401);
        }
        try {
            $jwtInfo = JWT::decode($jwtToken, Config::get('jwt.key'), [Config::get('jwt.alg')]); // 使用JWT解密Token
            $request->jwtInfo = $jwtInfo; // 将解密后的JWT信息存储在请求对象中,后续控制器可以使用
            return $next($request); // 继续后续请求处理
        } catch (Exception $e) {
            // JWT Token过期或者解密失败,返回错误信息
            return response(['msg' => 'JWT Token无效或已过期!'], 401);
        }
    }
}

在上面的程式碼中,我們檢查了請求的Authorization頭中是否包含有效的JWT令牌。如果JWT令牌無效或已過期,我們傳回一個未授權的HTTP回應,否則我們繼續後續請求處理,並將JWT令牌的資訊儲存在請求物件中,以供後續控制器使用。

最後,我們需要在應用程式的路由中使用JWT認證中間件來保護需要認證的API介面。例如,我們在routes/api.php檔案中加入以下程式碼:

<?php
use appmiddlewareJwtAuth;

// 需要JWT认证的API接口
Route::get('dashboard', 'AuthController@dashboard')->middleware(JwtAuth::class);

在上面的程式碼中,我們將dashboard方法使用JwtAuth中間件進行了保護,確保只有帶有有效JWT令牌的請求才能訪問它。

結論

在本文中,我們介紹如何使用ThinkPHP6進行JWT認證,以確保Web應用程式的安全性和可靠性。我們首先安裝並設定了JWT擴展,然後實作了JWT認證控制器和JWT認證中間件,最後在應用程式的路由中使用JWT認證中間件來保護需要認證的API介面。透過這些步驟,我們可以在ThinkPHP6應用程式中輕鬆實現JWT認證機制,確保Web應用程式的安全性和可靠性。

以上是如何使用ThinkPHP6進行JWT認證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1

記事本++7.3.1

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

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境