42

我已经根据django rest framework Docs实现了 Token Authentication 。

从我所读到的,DRF 的令牌身份验证非常简单 - 每个用户一个令牌,令牌不会过期并且始终有效(对吗?)。

我知道那里有更好的做法,但现在 DRF 令牌身份验证对我来说很好。

我的问题是-使用普通 DRF 令牌身份验证注销的最佳做法是什么?

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

有这方面经验的人吗?

4

3 回答 3

56

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

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()),
]
于 2016-03-06T19:42:05.193 回答
16

令牌认证的全部想法:

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

access_token 的生命周期与授予客户端访问权限的用户的登录会话无关。可以说,OAuth2 没有用户登录或注销或会话的概念。该令牌仅用于识别用户,如果他是他所说的那个人。

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

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

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

要自己实现它,您可以从 DRF Token Authentication 类继承并添加您的逻辑。
您甚至可以使用第三方包django-rest-framework-expiring-tokens

一些参考资料:
1. RESTful API 的令牌认证:令牌是否应该定期更改?
2.使用 OAuth2 登录谷歌的应用程序如何注销?

于 2015-06-09T19:04:13.813 回答
2

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

如果您在使用会话身份验证时遇到 csrftoken 问题,可能会很有帮助。

于 2016-03-02T03:30:25.087 回答