事象
Laravel + PHP-JWT + CognitoでユーザーをJWT検証で認証するWebアプリにて、
ある日突然ローカルでのみJWT検証でエラーが発生する事象が発生しました。
環境
- Laravel 6 + nginx + AWS Cognito
- Jwt検証用ライブラリ: Firebase/PHP-JWT (https://github.com/firebase/php-jwt)
エラー内容
Firebase\JWT\BeforeValidException: Cannot handle token prior to [time stamp]
(Google訳: [タイムスタンプ]より前のトークンを処理できません)
原因
JWTを発行するサーバー(Cognito)と検証側サーバー(ローカルサーバ)側で時刻が一致しない場合に起きるようです(下記Github issue参照)。
##対処法
$leeway
変数を再定義してサーバー時刻ずれを秒単位で許容することで回避できるそうです(defalutは0)。
ドキュメントによると数分以上の設定は非推奨とのことです。公式のサンプルでは1分に設定されていますが、今回は5秒に設定しました。
再発した場合はさらに許容時間を増やそうと思います。
use Firebase\JWT\JWT;
class JWTSampleClass
{
public static $leeway = 5; //5秒の時刻ズレの誤差を許容
//
}
参考