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に登録されている値と同一かなどを検証します。