JWT 認証に ThinkPHP6 を使用するにはどうすればよいですか?

王林
リリース: 2023-06-12 12:18:10
オリジナル
2505 人が閲覧しました

JWT (JSON Web Token) は、JSON オブジェクトをセキュリティ トークンとして使用し、複数のシステム間でユーザー ID 情報を安全に送信する軽量の認証および認可メカニズムです。 ThinkPHP6 は、PHP 言語をベースとした効率的かつ柔軟な MVC フレームワークであり、JWT 認証メカニズムを含む多くの便利なツールと機能を提供します。この記事では、Web アプリケーションのセキュリティと信頼性を確保するための JWT 認証に ThinkPHP6 を使用する方法を紹介します。

  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']];
    }
}
ログイン後にコピー

上記のコントローラー コードでは、2 つの関数を実装しました。1 つはユーザー ログインで、もう 1 つはユーザー情報の取得です。ログイン プロセス中に、JWT トークンが生成され、後続のリクエストでの認証のためにクライアントに返されます。ダッシュボード メソッドでは、リクエストの Authorization ヘッダーに JWT トークンが含まれているかどうかを確認し、JWT を使用してトークンを復号化し、ユーザーの ID が有効かどうかを確認します。

  1. JWT 認証ミドルウェアの追加

最後に、認証を必要とする API インターフェイスを保護するために、JWT 認証ミドルウェアをアプリケーションに追加する必要があります。 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 トークンが無効であるか期限切れの場合は、Unauthorized HTTP 応答を返します。それ以外の場合は、後続のリクエスト処理を続行し、後続のコントローラーで使用できるように JWT トークンの情報をリクエスト オブジェクトに保存します。

最後に、アプリケーションのルーティングで JWT 認証ミドルウェアを使用して、認証を必要とする API インターフェイスを保護する必要があります。たとえば、次のコードをroutes/api.phpファイルに追加します:

<?php
use appmiddlewareJwtAuth;

// 需要JWT认证的API接口
Route::get('dashboard', 'AuthController@dashboard')->middleware(JwtAuth::class);
ログイン後にコピー

上記のコードでは、JwtAuthミドルウェアを使用してダッシュボードメソッドを保護し、有効なJWTトークンを持つリクエストのみが存在するようにしました。アクセスするには。

結論

この記事では、Web アプリケーションのセキュリティと信頼性を確保するために、JWT 認証に ThinkPHP6 を使用する方法を紹介しました。最初に JWT 拡張機能をインストールして構成し、次に JWT 認証コントローラーと JWT 認証ミドルウェアを実装し、最後にアプリケーションのルーティングで JWT 認証ミドルウェアを使用して、認証を必要とする API インターフェイスを保護しました。これらの手順を通じて、ThinkPHP6 アプリケーションに JWT 認証メカニズムを簡単に実装して、Web アプリケーションのセキュリティと信頼性を確保できます。

以上がJWT 認証に ThinkPHP6 を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート