请教执行退出 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并没有进入黑名单,还是能好用。

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5
auth()->logout();

可以吗?

5年前 评论

@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吗?

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

谢谢! 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,应该不会有不能添加进黑名单的问题了

5年前 评论

file

我打印了三次。。。

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

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

5年前 评论

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

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

        }
5年前 评论

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