Laravel with jwt(using jwt-auth)を設定しました。Kernel.php-$ routeMiddlewareに追加しました:
'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class
私が理解しているように、「jwt.refresh」はリクエストごとにユーザーの新しいトークンを自動的に更新/作成します。
私のシングルページajaxアプリでは、ユーザーがログインしているかどうかを確認する必要があるため、この関数を呼び出すルートを追加しました。
public function isAuthenticated() {
$token = JWTAuth::getToken();
if(!$token){
throw new JWTException('Token not provided');
}
try{
$token = JWTAuth::refresh($token);
}catch(TokenInvalidException $e){
throw new AccessDeniedHttpException('The token is invalid');
}
return $this->response->withArray(['token'=>$token]);
}
問題は、isAuthenticated()が呼び出されると、JWTAuth :: refresh($ token)呼び出しが失敗することです。
トークンが更新されることと関係があると思います。
私がやりたいのは、クライアントのトークンが有効な場合にtrueを返すことです。これを行う方法はありますか?
'jwt-refresh'を削除しても、問題は解決しないようです。
前もって感謝します!
私の最初の観察は、トークンはどこに保存されているのかということです。リクエストで解析されていますか?アプリがAPIでjwtを使用している場合、各リクエストにはログインユーザーを示すトークンが必要であると私は信じているので、次のようなものが役立ちます。
try {
if (! $token = JWTAuth::parseToken()) {
//throw an exception
}
} catch (Exception $e) {
if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException){
//throw an exception
}else if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException){
//throw an exception
} else if ( $e instanceof \Tymon\JWTAuth\Exceptions\JWTException) {
//throw an exception
}else{
//throw an exception
}
}
リクエストから正常に解析された場合、次のようになります。
$user = JWTAuth::toUser($token);
参照: https://github.com/tymondesigns/jwt-auth/wiki/Authentication
サンプルコードでは、トークンが設定されていない場合、何も取得されません。ただし、セッションベースの認証が必要な場合は、Laravelのデフォルトの認証を使用してみませんか。
お役に立てれば :)