Laravel PHP JWTの発行と検証を単独で行う

プログラミング

JWT認証といえばtymon/jwt-authなどを使用してEloquentモデルと紐づけた実装が一般的です。ログイン認証であればこれで良いのですが、今回ログイン認証ではなくリクエストに含まれるJWTを検証して自身が発行したJWTと同一であれば処理を進める実装が必要になりました。

firebase/php-jwtのインストール

JWTのエンコード・デコードを行うためにfirebase/php-jwtを使用します。

composer require firebase/php-jwt

JWTのエンコード・デコードはライブラリに頼らず自作することも可能です。実際にfirebase/php-jwtのJWT.phpのdecodeメソッドを見てみるとデコードする処理を確認することができます。もちろんライブラリを使った方がお手軽なので使用をおすすめします。

JWTの発行

JWTの発行は非常にシンプルです。

use Firebase\JWT\JWT;

中略

$jwt = JWT::encode(["test" => "1234"], $secretKey, "HS256");

使用したいモデルやコントローラーなどでJWTを読み込み、JWT::encodeメソッドを呼び出します。

第一引数には好きなパラメーターを配列で渡すことができます。サンプルのように適当なパラメーターを渡すこともできますし、一般的にはここでJWTの期限などを設定することが多いです。

第二引数では秘密鍵を設定します。環境変数などに用意した秘密鍵を読み込むようにします。

第三引数にはアルゴリズムを渡します。複数のアルゴリズムがサポートされますが、今回はシンプルなHS256を使用しています。

第四引数はオプションでキーID、第五引数にはヘッダー用の配列を渡すことが可能です。

JWTの検証

リクエストなどで受け取ったJWTを検証します。

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

$decoded = JWT::decode($jwt, new Key($secretKey, "HS256"));
// $decoded->test でペイロード内のtest要素を参照できる

JWTを検証する際にはJWT¥Keyを読み込む必要があります。

JWT::decodeメソッドを使い方はencodeメソッドをほとんど変わりません。リクエストなどで受け取ったJWTである$jwtを指定した秘密鍵とアルゴリズムでデコードします。

デコード済みのオブジェクトのペイロードには$decoded->testのようにアクセスすることができます。これでペイロードの中身を確認して、期限が切れていないか、設定されている値がDBに登録されている値と同一かなどを検証します。

タイトルとURLをコピーしました