Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何以编程方式注销用户?[Django]_Python_Django_Python 3.x_Oauth_Django Rest Framework - Fatal编程技术网

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

Python 如何以编程方式注销用户?[Django],python,django,python-3.x,oauth,django-rest-framework,Python,Django,Python 3.x,Oauth,Django Rest Framework,我知道在Django中注销用户。如果我想注销用户,我会这样做 from django.contrib.auth import logout def logout_view(request): logout(request) 但是,如果我使用django oauth toolkit(DOT),那么注销用户的相关方式是什么 我应该遵循相同的规则还是删除令牌?有些人说删除代币,有些人说应该过期。请为我提供使用DOT登录DRF的最佳分辨率。您可以查看 在第1部分之后,您已经向用户授予了一个访

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

from django.contrib.auth import logout

def logout_view(request):
    logout(request)
但是,如果我使用django oauth toolkit(DOT),那么注销用户的相关方式是什么

我应该遵循相同的规则还是删除令牌?有些人说删除代币,有些人说应该过期。请为我提供使用DOT登录DRF的最佳分辨率。

您可以查看

在第1部分之后,您已经向用户授予了一个访问令牌,现在您希望撤销该令牌,这可能是为了响应客户端请求(注销)

编辑 如果您遵循教程第2部分的内容,您会发现您已经有了撤销令牌url,所以您只需要向该url发送请求

编辑2 让我来解释清楚

当您使用Django OAuth工具包和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/
您可以在这里看到源代码和文档

刷新()

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

但请记住,从

access_令牌的生存期与授予客户端访问权限的用户的登录会话无关。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)

所以我应该从前端(通过ajax中的头)发送令牌、客户机id和客户机机密(如果机密的话),并调用上面提到的注销(请求)函数?是的,您可以按照教程进行操作。这都是关于curl no views部分的。我很难在视图中对其进行编程。我对我的观点到底应该是什么一无所知?然后我将首先学习curl部分的教程。你只需要将参数发布到你的api中,不管你是否使用DRF,如果只是为了注销。那么我的注销视图应该在哪里?您能创建一个框架,并从前端传递哪个url吗?没有逻辑只是框架(比如如果我想使用普通身份验证注销,我会有一个url和视图作为)url(r'^/user/logout/',UserLogout.as_view(),name=“user_logout”)和类UserLogout。在前端,我将传递action={%url'用户\注销“%}。如果使用ajax,我会使用url:“/user/logout/”。你能不能像我创建的那样创建一个结构?我会将其标记为已回答,这样就更容易通过编程掌握流程。
{
    "access_token": "<your_access_token>",
    "token_type": "Bearer",
    "expires_in": 36000,
    "refresh_token": "<your_refresh_token>",
    "scope": "read write groups"
}
curl -H "Authorization: Bearer <your_access_token>" http://localhost:8000/users/1/
from django.contrib.auth import logout

def logout_view(request):
    logout(request)
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)