我用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'似乎没有为我们解决问题。
提前谢谢!
答案 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);
}