如何删除 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 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

Django rest 框架 jwt 令牌权限

React Native:如何使用 AsyncStorage 和 JWT 删除令牌?

如何从 Keycloak JWT 访问令牌中删除属性?

页面刷新时 JWT Token 已从标题中删除,如何修复?

drf django rest auth 如何过期或删除令牌?

每次使用 django-graphql-jwt 生成新令牌时,如何撤销 JWT?