我已根据django rest framework Docs实施了令牌身份验证。
从我读到的内容来看,DRF的令牌认证非常简单 - 每个用户一个令牌,令牌不会过期并且始终有效(我是对吗?)。
我知道有更好的做法,但是现在DRF令牌认证对我来说很好。
我的问题是 注销与正常DRF令牌身份验证的最佳做法是什么?
我的意思是,当用户注销时,是否应该从客户端删除令牌?然后在登录再次获取令牌?我应该删除令牌并生成一个新令牌吗?
有经验的人吗?
答案 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可能会非常有用。