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

Posted

技术标签:

【中文标题】如何使用 Simple JWT(django rest)将 JWT 令牌列入黑名单?【英文标题】:How to blacklist a JWT token with Simple JWT (django rest)? 【发布时间】: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 访问令牌列入黑名单的方法。 【参考方案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)

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

【讨论】:

以上是关于如何使用 Simple JWT(django rest)将 JWT 令牌列入黑名单?的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework 中 Simple-JWT 的自定义权限

Django DRF websocket 通道 2 并使用来自 Simple JWT 的令牌进行授权

使用 Django Rest Framework Simple JWT TokenRefresh 返回用户名和 ID

从 Django Rest Framework SIMPLE JWT 令牌(第 3 方)获取中间件中的用户名

在 Django simple-jwt 令牌身份验证中获取后端中的当前刷新令牌

如何使 jwt-simple 中的令牌过期?