6 个答案:
答案 0 :(得分:42)
JWT存储在浏览器上,因此删除在客户端删除cookie的令牌
如果您还需要在服务器端到期之前使令牌无效,例如帐户已删除/阻止/暂停,密码已更改,权限已更改,用户已由管理员注销,请查看Invalidating JSON Web Tokens一些公共技术,如创建黑名单或旋转令牌
答案 1 :(得分:7)
创建令牌后,无法手动使令牌失效。因此,实际上无法像在会话中那样在服务器端使用JWT注销。
JWT是无状态的,这意味着您应该将所需的所有内容存储在有效负载中,并跳过对每个请求的数据库查询。但是,如果您计划具有严格的注销功能,即使您已从客户端清除了令牌,也无法等待令牌自动过期,那么您可能需要忽略无状态逻辑并执行一些查询。那么有什么解决方案?
在令牌上设置合理的到期时间
注销后从客户端删除存储的令牌
在每个授权请求上针对黑名单查询提供的令牌
黑名单
所有不再有效且尚未过期的令牌的“黑名单”。您可以在文档上使用带有TTL选项的数据库,该数据库将设置为令牌过期之前剩余的时间。
Redis
Redis是黑名单的一个不错的选择,它将允许在内存中快速访问该列表。然后,在针对每个授权请求运行的某种中间件中,您应该检查提供的令牌是否在黑名单中。如果是这样,则应抛出未授权的错误。如果不是,则放手,JWT验证将处理它,并确定它是否已过期或仍处于活动状态。
答案 2 :(得分:1)
您可以在令牌中添加“发出时间”,并为服务器上的每个用户维护“上次注销时间”。在检查令牌有效性时,还要在“上次注销时间”之后检查“签发时间”。
答案 3 :(得分:1)
从客户端注销,最简单的方法是从浏览器的存储中删除令牌。
但是,如果您想销毁节点服务器上的令牌,该怎么办-
JWT软件包的问题在于它没有提供任何方法或方法来破坏令牌。
因此,为了销毁服务器端的令牌,您可以使用jwt-redis软件包而不是JWT
此库(jwt-redis)完全重复了库jsonwebtoken的全部功能,但有一个重要的补充。 Jwt-redis允许您将令牌标签存储在redis中以验证有效性。 Redis中没有令牌标签会使令牌无效。要销毁jwt-redis中的令牌,有一种destroy方法
它以这种方式工作:
1)从npm安装jwt-redis
2)要创建-
var redis = require('redis');
var JWTR = require('jwt-redis').default;
var redisClient = redis.createClient();
var jwtr = new JWTR(redisClient);
jwtr.sign(payload, secret)
.then((token)=>{
// your code
})
.catch((error)=>{
// error handling
});
3)要验证-
jwtr.verify(token, secret);
4)要摧毁-
jwtr.destroy(token)
注意:您可以像在JWT中提供的一样,在令牌登录期间提供expiresIn。
答案 4 :(得分:0)
在控制器中创建注销功能,如下所示:
public function logout() {
Auth::guard('api')->logout();
return response()->json([
'status' => 'success',
'message' => 'logout'
], 200);
}
答案 5 :(得分:0)
虽然其他答案为各种设置提供了详细的解决方案,但这可能会帮助正在寻找一般答案的人。
共有三个常规选项,选择一个或多个:
在客户端,使用javascript从浏览器中删除cookie。
在服务器端,将cookie值设置为空字符串或无用的东西(例如"deleted"),并将cookie过期时间设置为过去的时间。
在服务器端,更新存储在数据库中的刷新令牌。使用此选项可从所有已登录用户的设备中注销用户(其刷新令牌将无效,因此他们必须再次登录)。