如何删除 django JWT 令牌?
Posted
技术标签:
【中文标题】如何删除 django JWT 令牌?【英文标题】:How to delete a django JWT token? 【发布时间】:2017-03-29 01:01:21 【问题描述】:我正在使用在 github (https://github.com/GetBlimp/django-rest-framework-jwt/tree/master/) 上找到的 Django REST 框架 JSON Web 令牌 API。
我可以成功创建令牌并使用它们来调用受保护的 REST API。但是,在某些情况下,我想在特定令牌到期之前删除它。所以我想用这样的视图来做到这一点:
class Logout(APIView):
permission_classes = (IsAuthenticated, )
authentication_classes = (JSONWebTokenAuthentication, )
def post(self, request):
# simply delete the token to force a login
request.auth.delete() # This will not work
return Response(status=status.HTTP_200_OK)
request.auth
只是一个字符串对象。所以,这当然是行不通的,但我不确定如何清除底层令牌。
编辑
阅读更多相关信息,我似乎不需要做任何事情,因为 JWT 不会在服务器端存储任何内容。因此,只需关闭应用程序并在下次登录时重新生成令牌就足够了。对吗?
【问题讨论】:
【参考方案1】:是的,说 JWT 令牌没有存储在数据库中是正确的。但是,您想要的是根据用户活动使令牌无效,which doesn't seem to be possible ATM。
因此,您可以按照问题中的建议进行操作,或者将用户重定向到某个token refreshing endpoint,甚至manually create a new token。
【讨论】:
【参考方案2】:JWT 最大的缺点是因为服务端不保存会话状态,所以在使用过程中不能废除一个 token 或者改变 token 的权限。也就是说,一旦 JWT 被签名,它将一直有效直到过期,除非服务器部署了额外的逻辑。 因此,即使您创建新令牌或刷新它,您也不能使令牌无效。注销的简单方法是从客户端删除令牌。
【讨论】:
【参考方案3】:在 Admin.py 中添加这个
class OutstandingTokenAdmin(token_blacklist.admin.OutstandingTokenAdmin):
def has_delete_permission(self, *args, **kwargs):
return True # or whatever logic you want
admin.site.unregister(token_blacklist.models.OutstandingToken)
admin.site.register(token_blacklist.models.OutstandingToken, OutstandingTokenAdmin)
【讨论】:
以上是关于如何删除 django JWT 令牌?的主要内容,如果未能解决你的问题,请参考以下文章
React Native:如何使用 AsyncStorage 和 JWT 删除令牌?