Laravel 5.5 / Angular JWT注销

时间:2018-01-07 13:23:32

标签: php angular laravel authorization jwt

我在使用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方法(没有令牌,他们不会工作)

1 个答案:

答案 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();
}