注销Django Rest Framework JWT

时间:2018-09-20 19:16:13

标签: django django-rest-framework jwt session-state django-rest-framework-jwt

我想问一下在使用JWT时注销是否是一个好主意。 要登录,我发送带有用户名和密码的发布请求以获取所需的令牌(保存到localStorage中),这将使我可以向需要令牌的视图发送更多请求。

但是我不确定如何注销用户。我可以清除localStorage,但是令牌仍然可用。

因此,我想问一问我是否应该使用refresh the token,因为我无法将其禁用。

预先感谢

3 个答案:

答案 0 :(得分:4)

您是正确的,即使您删除了JWT令牌后,它仍然在一段时间内保持有效令牌,直到过期。 JWT是无状态的。因此,如果要处理注销并使令牌无效,则必须保留数据库或内存高速缓存中的内容以存储无效(列入黑名单)的令牌。然后,您需要添加新的权限,以检查令牌是否已列入黑名单。

Current: 5

您可以在令牌过期后将其从黑名单中删除。

答案 1 :(得分:1)

您发布的每个JWT都应有一个到期日期,因此,每当您注销用户时,都应从本地存储cookie中删除jwt令牌。

  

但是令牌仍然可用。

不确定上面的行是什么意思,但是从本地存储和cookie中清除令牌后,您不必担心令牌是否仍对用户可用,因为无论哪种方式,令牌都将在到期日期后失效。

答案 2 :(得分:1)

创建令牌后,无法手动使令牌失效。因此,实际上无法像在会话中那样在服务器端使用JWT注销。

JWT是无状态的,这意味着您应该将所需的所有内容存储在有效负载中,并跳过对每个请求的数据库查询。但是,如果您计划具有严格的注销功能,即使您已从客户端清除了令牌,也无法等待令牌自动过期,那么您可能需要忽略无状态逻辑并执行一些查询。那么有什么解决方案?

  • 在令牌上设置合理的到期时间

  • 注销后从客户端删除存储的令牌

  • 在每个授权请求上针对黑名单查询提供的令牌

黑名单

所有不再有效且尚未过期的令牌的“黑名单”。您可以在文档上使用带有TTL选项的数据库,该数据库将设置为令牌过期之前剩余的时间。

Redis

Redis是黑名单的一个不错的选择,它将允许在内存中快速访问该列表。然后,在针对每个授权请求运行的某种中间件中,您应该检查提供的令牌是否在黑名单中。如果是这样,则应抛出未授权的错误。如果不是,则放手,JWT验证将处理它,并确定它是否已过期或仍处于活动状态。