インターネットの発展に伴い、Web アプリケーションのユーザー数が徐々に増加し、セキュリティの問題がますます重要になってきています。認証されたユーザーのみがアクセス許可を必要とするリソースにアクセスできるため、認証は Web アプリケーションのセキュリティの重要な部分です。
JSON Web Token (JWT) は軽量で自己完結型の認証トークンであり、Web アプリケーション間で情報を安全に転送するための優れた方法です。 JWT 認証スキームは、分散システムおよびシングルページ アプリケーションに適しています。
ThinkPHP は、安全な Web アプリケーションを開発するための多くのツールを提供する人気のある PHP フレームワークです。この記事では、ThinkPHP6 での認証に JWT を使用してアプリケーションのセキュリティを強化する方法について説明します。
開発環境と依存関係
始める前に、開発環境が正しく設定されていることを確認する必要があります。この記事で使用されている環境と依存関係は次のとおりです。ニーズに応じて変更してください。
ステップ 1 : Firebase をインストールするJWT PHP ライブラリ
Firebase JWT PHP ライブラリのインストールは、JWT 認証スキームを使用する最初のステップです。このライブラリは、JWT の作成、署名、検証に役立ちます。
Composer を使用して Firebase JWT PHP ライブラリをインストールできます。コマンド ラインで次のコマンドを入力します。
composer require firebase/php-jwt
ステップ 2: トークン クラスの作成
JWT の管理と使用を容易にするために、JWT のさまざまな側面を処理する Token という名前のクラスを作成します。検証。このクラスには、トークンの作成、トークンの検証、トークン情報の取得などの機能が含まれます。
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 を使用します。 JWT を作成および解析するための library ()
メソッドと decode()
メソッド。 $key
は JWT の署名に使用したキーで、$alg
は選択したアルゴリズムです。 createToken()
メソッドでは、JWT ペイロードの 4 つのキー (iss、iat、exp、sub) を使用し、カスタム data
を追加します。 $expiration
パラメータは、JWT の有効期限を指定します。そのため、JWTは有効期間内のみご利用いただけます。
ステップ 3: ミドルウェアでトークンを検証する
JWT 関連の作業を処理する Token クラスを作成したので、ミドルウェアでユーザーの 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 に保存します。このデータはコントローラで利用できるようになります。
/api/user のルートを保護したいとします。
route pi.php ファイルに次のようにルートを設定する必要があります。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>use appmiddlewareJwt;
Route::group('api', function() {
Route::get('user', 'UserController@getUserInfo')->middleware(Jwt::class);
});</pre><div class="contentsignin">ログイン後にコピー</div></div>
このルートでは、
ミドルウェアをパラメータとして middleware()
メソッドに渡していることに注意してください。これは、UserController
の getUserInfo()
メソッドのサンプル コードです。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><?php
namespace appcontroller;
use appcommonToken;
class UserController
{
public function getUserInfo()
{
$data = request()->data;
...
}
...
}</pre><div class="contentsignin">ログイン後にコピー</div></div>コントローラーでは、$request->data<p> を呼び出すことで、認証された JWT に保存されているデータにアクセスできます。 <code>
結論
JWT 認証方法を使用すると、Web アプリケーションの安全性と信頼性を高めることができます。この記事では、Firebase JWT PHP ライブラリを使用して ThinkPHP6 で JWT を作成および検証する方法について説明しました。
JWT関連の作業を行うためのTokenというクラスを作成し、JWTの検証やデータの設定を行うミドルウェアを追加しました。最後に、このミドルウェアを使用して JWT に保存されているデータにアクセスするルーティング コードとコントローラー コードを設定します。
JWT 認証を導入する主な目的は、認証されたユーザーのみがアプリケーション内のリソースを使用できるようにすることです。この記事が、JWT 認証を使用してアプリケーションを保護する方法を理解するのに役立つことを願っています。
以上がThinkPHP6 での JWT 検証の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。