【问题标题】:django rest framework - token authentication logoutdjango rest 框架 - 令牌认证注销
【发布时间】:2015-08-24 16:51:43
【问题描述】:

我已经按照django rest framework Docs实现了Token Authentication。

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

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

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

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

谁有这方面的经验?

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

令牌认证的整体思路:

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

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

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

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

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

要自己实现它,您可以从 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?

【讨论】:

【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 2023-03-29
    • 2021-08-03
    • 2015-03-07
    • 2016-08-12
    • 2014-12-24
    • 2019-01-25
    • 1970-01-01
    • 2015-03-25
    相关资源
    最近更新 更多