使用ThinkPHP JWT進行接口認證

在Web開發中,接口認證是很重要的一個環節。而JWT(Json Web Token)是目前比較常用的一種Token認證方式,因為它是無狀態,所以在分佈式的環境下很適合。ThinkPHP JWT是一個基於ThinkPHP5的JWT擴展,它可以幫助我們快速實現JWT的功能。

一、安裝和配置

首先,我們需要安裝ThinkPHP JWT擴展,可以通過Composer進行安裝:


composer require smartisan/think-jwt

然後,在config目錄下創建jwt.php文件,用於配置:


return [
    'key' => 'thinkphpjwt', // 用於簽名的Key
    'iss' => 'thinkphp', // 簽發者
    'aud' => 'client', // 面向的用戶
    'exp' => 7200, // 過期時間,單位秒
    'nbf' => 300, // 在此時間之前不可用,單位秒
    'sub' => '', // 主題
];

其中,’key’是用於簽名的Key,建議設置為隨機字符串,’iss’是簽發者,’aud’是面向的用戶,’exp’是過期時間,’nbf’是在此時間之前不可用,’sub’是主題。

接下來,在config目錄下的middleware.php文件中添加中間件:


return [
    'jwtAuth' => \smartisan\jwt\middleware\JWTAuth::class,
];

這樣,我們就將JWT認證的中間件加入到了中間件列表中,可以在需要認證的接口中使用該中間件進行認證。

二、生成和解析Token

採用JWT認證的過程中,需要生成Token,然後發送給客戶端,客戶端在請求接口時需要帶上該Token進行認證。而服務端在接收到請求之後需要解析Token,然後進行認證。下面我們分別來看一下如何生成Token和如何解析Token。

1、生成Token

首先,我們需要在需要認證的控制器中生成Token:


use smartisan\jwt\JWT;

class UserController extends Controller
{
    public function login()
    {
        // 驗證用戶名和密碼
        ...
        
        // 生成Token
        $key = config('jwt.key'); // 獲取key
        $jwt = JWT::getInstance();
        $payload = [
            'uid' => $user['uid'],
            'username' => $user['username'],
            'exp' => time() + config('jwt.exp'),
        ];
        $token = $jwt->getToken($payload, $key);
        
        // 返回Token
        return json([
            'code' => 200,
            'msg' => '登錄成功',
            'token' => $token,
        ]);
    }
}

在上面的代碼中,我們將uid和username放入了payload中,並設置Token的過期時間。然後通過JWT::getInstance()獲取JWT實例,調用getToken()方法生成Token,最後將Token返回給客戶端。

2、解析Token

在接收到客戶端請求時,我們需要先解析Token,然後進行認證:


use smartisan\jwt\JWT;

class UserController extends Controller
{
    public function getInfo()
    {
        // 解析Token
        $token = request()->header('Authorization');
        $key = config('jwt.key'); // 獲取key
        $jwt = JWT::getInstance();
        try {
            $payload = $jwt->verifyToken($token, $key);
        } catch (\Exception $e) {
            return json([
                'code' => 401,
                'msg' => '未登錄或登錄已過期',
            ]);
        }
        
        // 認證通過,返回用戶信息
        ...
    }
}

在上面的代碼中,我們通過request()->header(‘Authorization’)獲取請求頭中的Token,然後通過JWT::getInstance()獲取JWT實例,調用verifyToken()方法解析Token,如果Token解析失敗,則返回401狀態碼,認證失敗;否則,認證通過,返回用戶信息。

三、在路由中使用中間件

在ThinkPHP中,我們可以在路由中使用中間件,方便進行接口認證。在路由文件中,可以使用middleware()方法來添加中間件:


use think\Route;

Route::get('user/info', 'user/getInfo')->middleware('jwtAuth');

在上面的代碼中,我們將’user/getInfo’這個接口使用jwtAuth中間件進行認證。

四、使用JWT認證的優點

JWT認證有以下幾個優點:

1、無狀態

由於採用了JWT認證方式,因此我們不需要再維護Session或者Token,也不需要在服務端存儲Token。這樣,就可以避免諸如Session劫持等安全問題。

2、輕量級

JWT認證的Token可以很輕鬆地在不同的服務之間傳遞,因為它是一種基於Base64編碼的Token。這樣,對於服務端的負載也比較小。

3、可擴展性強

JWT認證是一種開放標準,因此可以很方便地擴展使用,也可以嵌入到其它的認證方式中。

4、易於實現

使用ThinkPHP JWT可以很方便地實現JWT認證,也可以很好地與ThinkPHP框架結合使用。

五、總結

本文主要對使用ThinkPHP JWT進行接口認證進行了詳細的介紹,包括安裝和配置、生成和解析Token、在路由中使用中間件和JWT認證的優點。希望對大家有所幫助。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/150835.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-09 02:14
下一篇 2024-11-09 02:14

相關推薦

  • JWT驗證Token的實現

    本文將從以下幾個方面對JWT驗證Token進行詳細的闡述,包括:JWT概述、JWT驗證Token的意義、JWT驗證Token的過程、JWT驗證Token的代碼實現、JWT驗證Tok…

    編程 2025-04-29
  • Java 監控接口返回信息報錯信息怎麼處理

    本文將從多個方面對 Java 監控接口返回信息報錯信息的處理方法進行詳細的闡述,其中包括如何捕獲異常、如何使用日誌輸出錯誤信息、以及如何通過異常處理機制解決報錯問題等等。以下是詳細…

    編程 2025-04-29
  • Python接口自動化測試

    本文將從如下多個方面對Python編寫接口自動化進行詳細闡述,包括基本介紹、常用工具、測試框架、常見問題及解決方法 一、基本介紹 接口自動化測試是軟件測試中的一種自動化測試方式。通…

    編程 2025-04-27
  • Jadoor門鎖開發接口接入指南

    本文將從多個方面詳細介紹如何將門鎖接入Jadoor平台的開發接口,方便開發者們快速實現門鎖遠程控制、開鎖記錄查看等功能。 一、Jadoor門鎖開發接口簡介 Jadoor是一款用於密…

    編程 2025-04-27
  • 後端接口設計開發經驗分享

    在受到前端某些限制或特殊需求時,後端接口的設計和開發顯得尤為重要。下面從以下幾個方面進行講述。 一、命名規範 合理的命名規範可以大大提高接口的可讀性和可維護性。以下是一些命名規範的…

    編程 2025-04-27
  • JWT String Argument Cannot Be Null or Empty

    JWT(JSON Web Token)是一種用於進行身份驗證的標準。在使用JWT時,經常會遇到「JWT String Argument Cannot Be Null or Empt…

    編程 2025-04-27
  • 期貨數據接口 Python:打通數字資產交易數據的關鍵

    本文將從以下幾個方面討論期貨數據接口 Python: 一、數據接口簡介 期貨數據接口是指為期貨從業人員提供用於獲取歷史、實時及未來交易數據的工具。Python是一種常用的編程語言,…

    編程 2025-04-27
  • 如何快速發佈http接口

    想要快速發佈http接口,可以從以下幾個方面入手。 一、選擇合適的框架 選擇合適的框架對於快速發佈http接口非常重要。目前比較受歡迎的框架有Flask、Django、Tornad…

    編程 2025-04-27
  • Javaweb 接口返回數據的定義與實現

    本文將介紹 javaweb 如何定義接口返回數據,並提供相應的代碼示例。 一、接口返回數據的定義 在 javaweb 開發中,我們經常需要通過接口返回數據。接口返回的數據格式通常是…

    編程 2025-04-27
  • Postman接口自動化

    一、安裝和使用Postman Postman是一個強大的API測試工具,可以使用它來測試各種類型的API請求和響應。在進行接口自動化測試之前,首先需要安裝和使用Postman。以下…

    編程 2025-04-25

發表回復

登錄後才能評論