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

在ThinkPHP6中使用JWT驗證

PHPz
發布: 2023-06-20 23:36:09
原創
3249 人瀏覽過

隨著網路的發展,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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板