【问题标题】:How to blacklist a JWT token with Simple JWT (django rest)?如何使用 Simple JWT(django rest)将 JWT 令牌列入黑名单?
【发布时间】:2020-01-20 11:22:45
【问题描述】:

我正在使用Simple JWT 在我的 Django REST API 中使用 JWT 令牌。它工作得很好,但我希望能够在用户注销时将令牌列入黑名单。在文档中说:

如果在 INSTALLED_APPS 中检测到黑名单应用,Simple JWT 会将任何生成的刷新或滑动令牌添加到未完成令牌列表中。它还将检查任何刷新或滑动令牌是否未出现在令牌黑名单中,然后才将其视为有效。 Simple JWT 黑名单应用使用两种模型实现其未完成和列入黑名单的令牌列表:OutstandingToken 和 BlacklistedToken。为这两个模型定义了模型管理员。要将token添加到黑名单中,在admin中找到其对应的OutstandingToken记录,再次使用admin创建指向OutstandingToken记录的BlacklistedToken记录。

但是,我没有找到任何代码示例,我不确定应该如何实现。一个例子将不胜感激。

【问题讨论】:

  • 你有什么解决办法吗?
  • 很遗憾没有
  • 我不断收到 TokenError(_('Token is invalid or expired'))token.blacklist() 实用程序,如文档中所述。
  • @qwertzuiop token_blacklist 只是将刷新令牌列入黑名单。我也找不到将 jwt 访问令牌列入黑名单的方法。

标签: django django-rest-framework jwt


【解决方案1】:

Simple JWT 仅将刷新令牌列入黑名单。这可以通过设置来完成:


INSTALLED_APPS = (
    ...
    'rest_framework_simplejwt.token_blacklist',
    ...
}

然后运行migrate

所以,我建议,为了注销用户:

  • 从客户端删除、刷新和访问令牌。此外,请尽可能缩短访问令牌的到期时间。

  • 通过创建 api 端点将刷新令牌列入黑名单。

    urls.py

    path('/api/logout', views.BlacklistRefreshView.as_view(), name="logout"),
    

    views.py

    from rest_framework_simplejwt.tokens import RefreshToken
    
    class BlacklistRefreshView(APIView):
        def post(self, request)
            token = RefreshToken(request.data.get('refresh'))
            token.blacklist()
            return Response("Success")
    

这将确保刷新令牌不能再次用于生成新令牌(如果有人获得了它)。另外,由于访问令牌的寿命很短,因此希望它很快就会失效。

【讨论】:

    【解决方案2】:

    对此不确定,但我可以使用token.blacklist()

    制作tokens.py

    from rest_framework_simplejwt.tokens import AccessToken, BlacklistMixin
    
    
    class JWTAccessToken(BlacklistMixin, AccessToken):
        pass
    

    settings.py

    SIMPLE_JWT = {
        ...
        'AUTH_TOKEN_CLASSES': ('path_to_tokens_py.tokens.JWTAccessToken',),
        ...
    }
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的错误:

      TokenError(_('令牌无效或过期'))

      因为传入了访问令牌:

      token = RefreshToken(access_token)
      

      虽然我应该传入刷新令牌。

      【讨论】:

        猜你喜欢
        • 2020-01-22
        • 2019-02-23
        • 2021-01-06
        • 2020-11-02
        • 1970-01-01
        • 2019-08-01
        • 2016-08-31
        • 2019-06-20
        • 2021-04-16
        相关资源
        最近更新 更多