我如何以编程方式注销用户?[Django]

时间:2016-09-08 01:11:18

标签: python django python-3.x oauth django-rest-framework

我知道在Django中注销用户。如果我想退出用户,我会做

from django.contrib.auth import logout

def logout_view(request):
    logout(request)

但是,如果我正在使用django oauth工具包(DOT),那么注销用户的相关方法是什么?

我应该遵循相同的规则还是删除令牌?有人说删除令牌,有些人说有效期应该过期。请为我提供使用DOT注销DRF的最佳解决方案。

1 个答案:

答案 0 :(得分:2)

您可以查看Revoking an OAuth2 Token

  

您已经在第1部分之后授予用户访问令牌,现在您想要撤销该令牌,可能是为了响应客户端请求(退出)。

Do you logout a user who login via OAuth2 by expiring their Access Token?

修改

# OAuth2 provider endpoints
oauth2_endpoint_views = [
    url(r'^authorize/$', oauth2_views.AuthorizationView.as_view(), name="authorize"),
    url(r'^token/$', oauth2_views.TokenView.as_view(), name="token"),
    url(r'^revoke-token/$', oauth2_views.RevokeTokenView.as_view(), name="revoke-token"),
]

如果你按照教程第2部分的说明,你会发现你已经拥有了revoke-token网址,所以你只需要向这个网址发送请求。

EDIT2

让我试着清楚解释一下

当您使用Django OAuth Toolkit和DRF时,通常会使用

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.ext.rest_framework.OAuth2Authentication',
    )
}

您可以通过

获取访问令牌
curl -X POST -d "grant_type=password&username=<user_name>&password=<password>" -u"<client_id>:<client_secret>" http://localhost:8000/o/token/

得到这样的回应

{
    "access_token": "<your_access_token>",
    "token_type": "Bearer",
    "expires_in": 36000,
    "refresh_token": "<your_refresh_token>",
    "scope": "read write groups"
}

现在您可以使用access_token来请求您设置的api

curl -H "Authorization: Bearer <your_access_token>" http://localhost:8000/users/1/

如何退出取决于您如何定义登录

网站定义cookie中会话的登录。当您开发移动应用程序时,您将在应用程序中定义登录依赖于消息({I}时的user credentials present in keychain or not),这就是您的代码所做的事情:

from django.contrib.auth import logout

def logout_view(request):
    logout(request)

您可以在此处查看源代码django-logout和文档here

  

齐平()

     

从会话中删除当前会话数据并删除会话cookie。如果要确保无法从用户的浏览器再次访问先前的会话数据(例如,django.contrib.auth.logout()函数调用它),则使用此方法。

但请记住,来自Luke Taylor

  

access_token的生命周期独立于授予客户端访问权限的用户的登录会话。 OAuth2没有用户登录或注销或会话的概念,因此您希望注销撤销令牌这一事实似乎表明您误解了OAuth2的工作原理。你应该在你的问题中澄清为什么你希望事情以这种方式运作以及为什么你需要OAuth。

最后在您的情况下,我认为您需要在注销前重新启动令牌:

def revoke-token(request):
    # just make a request here
    # POST /o/revoke_token/ HTTP/1.1 Content-Type: application/x-www-form-urlencoded token=XXXX&client_id=XXXX&client_secret=XXXX


def logout(request):
    response = revoke-toke(request)
    # if succeed
    logout(request)