django rest framework - 令牌认证注销

时间:2015-06-09 17:52:18

标签: login django-rest-framework token logout http-token-authentication

我已根据django rest framework Docs实施了令牌身份验证。

从我读到的内容来看,DRF的令牌认证非常简单 - 每个用户一个令牌,令牌不会过期并且始终有效(我是对吗?)。

我知道有更好的做法,但是现在DRF令牌认证对我来说很好。

我的问题是 注销与正常DRF令牌身份验证的最佳做法是什么?

我的意思是,当用户注销时,是否应该从客户端删除令牌?然后在登录再次获取令牌?我应该删除令牌并生成一个新令牌吗?

有经验的人吗?

3 个答案:

答案 0 :(得分:25)

这是一个我用来注销的简单视图:

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()),
]

答案 1 :(得分:7)

令牌认证的全部意图:

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

access_token的生命周期独立于授予客户端访问权限的用户的登录会话。假设OAuth2没有用户登录或注销或会话的概念。 该令牌仅用于识别用户是否是他所说的人。

用户和客户端的令牌唯一。您可以将其保存到cookie以启用类似记住我的内容,但在服务器上您不需要删除它。每当令牌到期时,客户端需要向服务器发送请求以再次获得令牌。

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

目前,DRF令牌身份验证不支持此功能。您必须自己实现它或使用提供此功能的第三方软件包。它应该检查令牌到期并在令牌过期时引发异常。

要自己实现它,您可以从DRF令牌认证类继承并添加您的逻辑 您甚至可以使用第三方软件包django-rest-framework-expiring-tokens

一些参考文献:
1. Token Authentication for RESTful API: should the token be periodically changed?
2. How to Logout of an Application Where I Used OAuth2 To Login With Google?

答案 2 :(得分:1)

听起来SessionAuthentication就是你真正想要的。您可以通过BasicAuthentication或TokenAuthentication启动(登录)会话。然后使用sessionid作为"令牌"其余的api电话。 "令牌"当你退出或超过某个时间时到期。

如果您使用会话身份验证遇到csrftoken问题,this可能会非常有用。