Laravel和jwt-auth - 如何检查用户是否已登录

Tho*_*sen 6 jwt laravel

我用jwt设置了Laravel(使用jwt-auth).在我的Kernel.php - $ routeMiddleware中我添加了:

'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class
Run Code Online (Sandbox Code Playgroud)

据我所知,'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]);
  }
Run Code Online (Sandbox Code Playgroud)

问题是当调用isAuthenticated()时,JWTAuth :: refresh($ token)调用失败.

我想这与令牌刷新有关.

我想要做的是,如果客户端的令牌有效,则返回true.有没有办法做到这一点?

删除'jwt-refresh'似乎无法为我们解决问题.

先感谢您!

Olu*_*kin 8

我的第一个观察是,令牌存储在哪里?它是否与请求一起解析?因为我相信如果您的应用程序将 jwt 与 api 一起使用,那么每个请求都应该有一个令牌来表示已登录的用户,因此这样的事情会有所帮助:

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
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果从请求中成功解析,则:

$user = JWTAuth::toUser($token);
Run Code Online (Sandbox Code Playgroud)

见:https : //github.com/tymondesigns/jwt-auth/wiki/Authentication

使用您的示例代码,如果未设置令牌 - 不会检索任何内容。但是,如果您想要基于会话的身份验证,为什么不使用 Laravel 的默认身份验证。

希望这可以帮助 :)