请教执行退出 jwt-auth 时,为什么会出现 token 不能解析的错误?

我使用 JWTAuth::attempt( 登录了laravel,成功获取了 token。调用退出时,在head中添加了“Authorization:Bearer xxxxxxx”,xxxx是新创建的token。
退出的控制器非常简单,只有

auth()->logout(true);

但是经常出现“Token could not be parsed from the request”的错误。

我发现出错的地方是,根\vendor\tymon\jwt-auth\src\JWTGuard.php的logout函数中执行 invalidate 的地方。
我把

$this->requireToken()->invalidate($forceForever);

改成了

try
{
    $this->requireToken()->invalidate($forceForever);
} catch (JWTException $e) {
    var_dump($e->getMessage());
}

发现执行到这里时,会执行异常处理,打印出来“Token could not be parsed from the request”的错误。
但是因为在 ->invalidate 的时候出错,token并没有进入黑名单,还是能好用。

请问在退出的时候,我还需要做哪些处理?
非常感谢!

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5
auth()->logout();

可以吗?

6年前 评论

@likunyan 感谢关注!

auth()->logout();

也经常出错。

我试了很多次,发现的规律是,如果把现有的token加进黑名单,就会 出现“Token could not be parsed from the request” 的错误。但是如果超出了jwt.php中设定的有效期JWT_TTL,auth()->logout()就不会出错了,因为现有的token已经进了黑名单了。

另外,不知道为什么,我在【根\vendor\tymon\jwt-auth\src\Validators\TokenValidator.php】文件的

protected function validateStructure($token)

echo了参数 $token,结果这个函数执行了两次,其中一次的 $token 的值是 “Bearer”。可能是解析这个“Bearer”字符串的时候,出错了。 Postman测试的认证type是Bearer Token,ajax测试时也是这样传入的

    $.ajax({
    url:"/api/v1/logout",
    headers: {
        "Accept": "application/json; charset=utf-8",
        "Authorization": "Bearer " + myToken
    },
    ...

难道不能这样带入token吗?

6年前 评论
小李世界 6年前

谢谢! logout() 是在【根\vendor\tymon\jwt-auth\src\JWTGuard.php】中定义的,代码是

public function logout($forceForever = false)
{
        $this->requireToken()->invalidate($forceForever);

        $this->user = null;
        $this->jwt->unsetToken();
}

在这里,已经用 invalidate 执行了添加进黑名单的操作。 我再试试用Redis管理最后一个有效的token,应该不会有不能添加进黑名单的问题了

6年前 评论

file

我打印了三次。。。

auth()->logout(true); 加 true 也是可以,打印三次。

我觉得应该是黑名单问题了

6年前 评论

非常谢谢!我也遇到了不可理解的状况。 突然好用了!我什么都没改! 连续很多次,登录、退出,都没有出现任何错误! 不过我还是把【根 \vendor\tymon\jwt-auth\src\JWTGuard.php】的logout改成这样:

        try
        {
            $this->requireToken()->invalidate($forceForever);
        } catch (Exception $ex) {

        }
6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!