Laravel JWT 令牌总是被列入黑名单

Posted

技术标签:

【中文标题】Laravel JWT 令牌总是被列入黑名单【英文标题】:Laravel JWT Token Always Blacklisted 【发布时间】:2021-01-06 01:03:31 【问题描述】:

我正在为我的应用程序使用 tymondesigns/jwt-auth 包。我使用 customClaims 来制作我的令牌。 这是登录代码:

$token_data = [
        'iss' => new Issuer('AreteHCM'),
        'iat' => new IssuedAt(Carbon::now()) ,
        'exp' => new Expiration(Carbon::now()->addDays(1)),
        'nbf' => new NotBefore(Carbon::now()),
        'sub' => new Subject('AreteHCMS'),
        'jti' => new JwtId('AreteHCM'),
        'user_data' => $user->user,
        'menu_access' => $menu_access,
        'login_time' => Carbon::now(),
];
    
$customClaims = JWTFactory::customClaims($token_data);
$payload = JWTFactory::make($customClaims);
$token = JWTAuth::encode($payload)->get();

对于注销,我使令牌无效,因此用户注销后令牌不能再使用。

JWTAuth::invalidate(JWTAuth::getToken());

我正在使用 Angular 创建 API(后端)和前端团队。一切顺利,直到用户注销并尝试再次登录。登录后,用户获得了新账号,但是当他/她想访问我的中间件时总是拒绝令牌,它说令牌被列入黑名单。

这是我的中间件:

$token = JWTAuth::getToken();
$data = JWTAuth::getPayload($token)->toArray();

它总是显示错误:

The token has been blacklisted in file C:\xampp\htdocs\aretehcm\vendor\tymon\jwt-auth\src\Manager.php on line 109

我想接近的是:

用户登录获取新token来访问API(每个API请求都需要header auth Bearer token) 用户注销将使令牌失效,因此无法再使用令牌访问 API 用户登录将获得一个新令牌,以便他/她可以访问 API

我对 JWT-API 架构有什么误解吗? 提前感谢您的回复和回答。

【问题讨论】:

如何将令牌保存到数据库?请添加该代码。 尝试使用logout 而不是invalidate() 【参考方案1】:

快速的谷歌搜索将我指向这个解决方案: https://github.com/tymondesigns/jwt-auth/issues/983#issuecomment-275884324

【讨论】:

您好,感谢您的回答。我已经通过使 JWT_BLACKLIST_ENABLED=false 尝试了解决方案,但这使我在注销时无法使令牌无效。如果令牌没有失效,它仍然可以用来访问 API。 您是否尝试设置 JWT_BLACKLIST_ENABLED=false,然后设置 JWT_BLACKLIST_GRACE_PERIOD?其中一位表示将 JWT_BLACKLIST_GRACE_PERIOD 设置为 30 可以解决问题。 github.com/tymondesigns/jwt-auth/issues/…

以上是关于Laravel JWT 令牌总是被列入黑名单的主要内容,如果未能解决你的问题,请参考以下文章

如果用户想从不同的机器上退出帐户,JSON Web 令牌 (JWT) 是不是会被拒绝或列入黑名单?

JWT 注销:在微服务架构中的服务之间共享被列入黑名单的无效令牌

将 JSON Web 令牌列入黑名单

如何使用 Simple JWT(django rest)将 JWT 令牌列入黑名单?

Laravel JWT 刷新令牌中间件和并发请求

为 Spring Boot 制作黑名单 JWT 令牌