13

我已根据django rest framework Docs实施了令牌认证。django rest框架 - 令牌认证注销

形成我读的,DRF的令牌认证非常简单 - 每个用户一个令牌,令牌不会过期并且始终有效(我对吗?)。

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

我的问题是 -什么是注销的最佳实践与正常DRF令牌认证?

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

任何有此经验的人?令牌认证的

+0

可能重复[Django的REST框架 - 理解认证和登录](http://stackoverflow.com/questions/30546258/django-rest-framework-understanding-authentication-and-logging-in) –

回答

4

整体思路:

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

access_token的生命周期与授予客户端访问权限的用户的登录会话无关。可以说OAuth2没有用户登录或注销或会话的概念。 令牌只是用来标识用户,如果他是谁,他说他是谁。

令牌为唯一为用户和客户端。您可以将它保存为cookies以启用类似于记住我的功能,但在服务器上您不需要删除它。每当令牌过期时,客户端需要向服务器发送请求以再次获取令牌。

令牌到期的DRF令牌Authetication:

目前,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?

+0

感谢您的回答。从我读到的内容来看,DRF令牌永不过期,对吗? –

+0

是的,我认为目前在DRF令牌认证中没有令牌过期的功能。您需要实现您自己的令牌过期逻辑。 –

+0

也许这可能有帮助。 https://github.com/JamesRitchie/django-rest-framework-expiring-tokens –

1

这听起来像SessionAuthentication是你真正寻找。您可以通过BasicAuthentication或TokenAuthentication启动(登录)会话。然后使用sessionid作为其余api调用的“令牌”。当您注销或超过特定时间时,“令牌”将过期。

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

11

下面是我使用注销一个简单的观点:

from django.contrib.auth.models import User 
from rest_framework import status 
from rest_framework.response import Response 
from rest_framework.views import APIView 

class Logout(APIView): 
    queryset = User.objects.all() 

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

不错!谢谢! –

+2

对不起,但是'queryset'用于什么? – dangsonbk