【Laravel】JTIを指定してJWTトークンを無効化する


LaravelでAPIを構築するとJWTトークンを利用することがあると思います。
JTI(トークンの識別子)を指定してJWTトークンを無効化してみます。

実装するとこんな感じです。

use Tymon\JWTAuth\Providers\Storage\Illuminate as JWTStorage;

class JwtDisableService
{
    protected $jwtStorage;

    public function __construct(JWTStorage $jwtStorage)
    {
        $this->jwtStorage = $jwtStorage;
    }

    public function __invoke(string $jti)
    {
        // 無効化する
        $this->jwtStorage->forever($jti, 'forever');

        return response()->json([
            'result' => 'OK'
        ]);
     }
}

注意が必要なのは、JWTトークンの有効/無効判定はブラックリストをキャッシュで持つという点です。

JWTの有効なトークンはどこかで保持されている訳ではありません。
妥当な形式な有効期限内であるトークンは明示的に無効化されてなければ使えます。

なので、上記の方法でトークンを無効化したとしても、有効期限が切れる前にキャッシュクリアしてしまうと再度使えるようになります。
そこにだけ注意して実装する必要がありそうです。