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



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

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

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

简单的 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")
    

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

不确定这一点,但它对我使用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',),
...
}

我遇到了同样的错误:

令牌

错误(_("令牌无效或已过期"((

因为将访问令牌传入:

token = RefreshToken(access_token)

而我应该传入刷新令牌。

我们可以将刷新令牌列入黑名单 我会将 redis 与密钥对一起使用token[refresh]=access并使用黑名单端点检查刷新令牌

path('token/blacklist/', TokenBlacklistView.as_view(), name='token_blacklist'),

发送刷新令牌path('token/verify/', TokenVerifyView.as_view(), name='token_verify'),验证要发送刷新令牌的令牌。

使用内存数据库检查刷新的令牌黑名单 现在,您可以设置终点以检查访问列表令牌,不要忘记在settings.py中添加以下行

'ROTATE_REFRESH_TOKENS': True,
'BLACKLIST_AFTER_ROTATION': True,

最新更新