如何使用 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 方)获取中间件中的用户名