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

时间:2016-11-02 21:29:46

标签: laravel jwt

我用jwt设置了Laravel(使用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'似乎没有为我们解决问题。

提前谢谢!

2 个答案:

答案 0 :(得分:3)

我的第一个观察是,令牌存储在哪里?是否使用请求进行了解析?因为我相信如果你的应用程序使用带有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的默认身份验证。

希望这会有所帮助:)

答案 1 :(得分:0)

您可以获取与令牌相关的当前用户,并检查是否不为空:

$user = JWTAuth::setToken($token)->toUser();
if($user == null){
abort(401);
}