Django Rest Framework - Token认证注销

46
我已按照django rest framework Docs实现了Token身份验证。
据我所知,DRF的Token身份验证非常简单 - 每个用户一个令牌,令牌不会过期并且始终有效(我是对的吗?)。
我知道有更好的做法,但目前DRF令牌身份验证对我来说已经足够了。 我的问题是-在普通DRF令牌身份验证中,最佳的注销做法是什么?
我的意思是,当用户注销时,我应该从客户端删除令牌吗?然后在登录时重新获取令牌?还是应该删除令牌并生成新的令牌?
有经验的人能给点建议吗?

1
可能是重复的问题:Django Rest Framework - 理解身份验证和登录 - Kevin Brown-Silva
3个回答

62

这是我用来登出的简单视图:

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

class Logout(APIView):
    def get(self, request, format=None):
        # simply delete the token to force a login
        request.user.auth_token.delete()
        return Response(status=status.HTTP_200_OK)

然后将其添加到您的urls.py

urlpatterns = [
    ...
    url(r'^logout/', Logout.as_view()),
]

7
抱歉,queryset 用于什么? - dangsonbk
这种情况下它什么也不做。 - GordonW
12
Nit: 注销应该使用POST而不是GET方法:https://dev59.com/UnA75IYBdhLWcg3wAUF9 - erikreed
如果这是一个“删除”操作,为什么你使用了“获取”?@Cloud Artisans - undefined

18
令牌认证的整体思路:

通常在身份验证服务中,令牌会有一个与之关联的生命周期。特定时间后,令牌将过期。在这里,我们获得了一个访问令牌,服务器发送了一个带有到期时间的访问令牌。现在客户端需要在每个请求头中发送此令牌,以便服务器可以识别用户是谁。我们可以跟踪它何时过期,或者我们可以继续使用它,直到出现INVALID_TOKEN错误。在这种情况下,我们需要再次从服务器获取令牌。

访问令牌的生命周期独立于授予客户端访问权限的用户的登录会话。OAuth2,例如,没有用户登录或注销或会话的概念。 令牌只是用于识别用户是否是其所说的人。

令牌对于用户和客户端是唯一的。您可以将其保存到cookie中,以启用类似记住我之类的功能,但在服务器上不需要将其删除。令牌过期后,客户端需要向服务器发送请求以再次获取令牌。

DRF令牌认证中的令牌过期:

目前,DRF Token身份验证不支持此功能。您需要自己实现它或使用提供此功能的第三方软件包。它应该检查令牌过期并在令牌过期时引发异常。
要自己实现它,您可以从DRF Token身份验证类继承并添加自己的逻辑。
您甚至可以使用第三方软件包django-rest-framework-expiring-tokens
一些参考资料:
1. RESTful API的令牌身份验证:令牌是否应定期更改?
2. 如何注销使用OAuth2登录Google的应用程序?

谢谢您的回答。根据我所了解的,在DRF中令牌永不过期,是这样吗? - Ofek Agmon
是的,我认为DRF Token身份验证目前没有令牌过期的功能。您需要实现自己的逻辑来处理令牌过期。 - Rahul Gupta
也许这个能帮到你。https://github.com/JamesRitchie/django-rest-framework-expiring-tokens - Rahul Gupta
请看这个链接:https://dev59.com/rWUq5IYBdhLWcg3wXvIC - Rahul Gupta

2
听起来你真正需要的是会话认证。你可以通过基本认证或令牌认证开始(登录)一个会话。然后使用sessionid作为您在其余api调用中的“token”。当您注销或超过一定时间时,“token”将过期。
如果使用会话认证遇到csrftoken问题,这个可能会非常有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接