web-dev-qa-db-ja.com

Laravel andjwt-auth-ユーザーがログインしているかどうかを確認する方法

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'を削除しても、問題は解決しないようです。

前もって感謝します!

6
Thomas Andersen

私の最初の観察は、トークンはどこに保存されているのかということです。リクエストで解析されていますか?アプリが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のデフォルトの認証を使用してみませんか。

お役に立てれば :)