我在使用JWT package注销时遇到问题。在Angular方面,我从本地存储中删除令牌并调用Laravel API:
logout(): void {
this.cacheHandler.clearCache();
return this.http.get(environment.apiUrl + 'logout')
.toPromise()
.then(response => {
const responseData = response.json();
return responseData.success;
})
.catch(error => {
return error;
});
}
在Laravel方面:
public function logout()
{
try {
JWTAuth::invalidate(JWTAuth::getToken());
return response()->json(['success' => true, 'message' => 'Logout successful'], 200);
} catch (JWTException $e) {
return response()->json(['success' => false, 'error' => 'Failed to logout, please try again.'], 500);
}
}
API方法受JWT auth中间件保护,因此在调用API时,我转发存储在本地存储中的授权承载令牌。方法传递,令牌有效。
之后它进入logout()
方法,我收到注销成功的响应。
问题是我可以使用相同的令牌触发相同的请求,始终获得相同的消息。如果它失效,它就无法触发第二个请求,因为它位于中间件后面。
此外,使用相同的令牌,它应该是无效的,我可以调用其他需要身份验证的API方法(没有令牌,他们不会工作)
答案 0 :(得分:0)
尝试使用新的JWTGuard并将其称为:
public function logout()
{
$this->guard()->logout(); // pass true to blacklist forever
}
该注销函数调用以下代码:
public function logout($forceForever = false)
{
$this->requireToken()->invalidate($forceForever);
$this->user = null;
$this->jwt->unsetToken();
}