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

qwe*_*iop 5 django jwt django-rest-framework

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

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

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

DHS*_*DHS 8

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


INSTALLED_APPS = (
    ...
    'rest_framework_simplejwt.token_blacklist',
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后运行migrate

因此,我建议,为了注销用户:

  • 从客户端删除刷新和访问令牌。此外,保持访问令牌的过期时间尽可能短。

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

    urls.py

    path('/api/logout', views.BlacklistRefreshView.as_view(), name="logout"),
    
    Run Code Online (Sandbox Code Playgroud)

    视图.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")
    
    Run Code Online (Sandbox Code Playgroud)

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


小智 0

我遇到了同样的错误:

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

因为将访问令牌传递给:

token = RefreshToken(access_token)
Run Code Online (Sandbox Code Playgroud)

而我应该传递刷新令牌。