我已经根据django rest framework Docs实现了 Token Authentication 。
从我所读到的,DRF 的令牌身份验证非常简单 - 每个用户一个令牌,令牌不会过期并且始终有效(对吗?)。
我知道那里有更好的做法,但现在 DRF 令牌身份验证对我来说很好。
我的问题是-使用普通 DRF 令牌身份验证注销的最佳做法是什么?
我的意思是,当用户注销时,我应该从客户端删除令牌吗?然后在登录时再次获取令牌?我应该删除令牌并生成一个新令牌吗?
有这方面经验的人吗?
我已经根据django rest framework Docs实现了 Token Authentication 。
从我所读到的,DRF 的令牌身份验证非常简单 - 每个用户一个令牌,令牌不会过期并且始终有效(对吗?)。
我知道那里有更好的做法,但现在 DRF 令牌身份验证对我来说很好。
我的问题是-使用普通 DRF 令牌身份验证注销的最佳做法是什么?
我的意思是,当用户注销时,我应该从客户端删除令牌吗?然后在登录时再次获取令牌?我应该删除令牌并生成一个新令牌吗?
有这方面经验的人吗?
这是我用来注销的简单视图:
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()),
]
令牌认证的全部想法:
通常在身份验证服务中,令牌有一个生命周期。在特定时间后,令牌将过期。在这里,我们得到一个访问令牌,该令牌具有服务器发送的到期时间。现在客户端每次都需要在请求头中发送这个令牌,以便服务器可以识别用户是谁。我们可以跟踪它何时过期,或者我们可以继续使用它直到出现INVALID_TOKEN错误。在这种情况下,我们将不得不再次从服务器获取令牌。
access_token 的生命周期与授予客户端访问权限的用户的登录会话无关。可以说,OAuth2 没有用户登录或注销或会话的概念。该令牌仅用于识别用户,如果他是他所说的那个人。
令牌对于用户和客户端是唯一的。您可以将其保存到 cookie 以启用类似记住我的功能,但在服务器上您不需要删除它。每当令牌过期时,客户端需要向服务器发送请求以再次获取令牌。
DRF 令牌认证中的令牌到期:
目前,DRF Token 身份验证不支持此功能。您必须自己实现它或使用提供此功能的第三方包。它应该检查令牌过期并在令牌过期时引发异常。
要自己实现它,您可以从 DRF Token Authentication 类继承并添加您的逻辑。
您甚至可以使用第三方包django-rest-framework-expiring-tokens。
一些参考资料:
1. RESTful API 的令牌认证:令牌是否应该定期更改?
2.使用 OAuth2 登录谷歌的应用程序如何注销?
听起来SessionAuthentication是您真正想要的。您可以通过 BasicAuthentication 或 TokenAuthentication 启动(登录)会话。然后使用 sessionid 作为其余 api 调用的“令牌”。当您注销或超过特定时间时,“令牌”就会过期。
如果您在使用会话身份验证时遇到 csrftoken 问题,这可能会很有帮助。