Django REST API 注销请求

Posted

技术标签:

【中文标题】Django REST API 注销请求【英文标题】:Django REST API Logout request 【发布时间】:2014-12-22 13:09:23 【问题描述】:

为了登录,我正在做类似的事情:

function setHeader(xhr) 
        // as per HTTP authentication spec [2], credentials must be
        // encoded in base64. Lets use window.btoa [3]
        xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ':' + password));
    

    $.ajax(type: "POST",  url: AUTH_URL,  beforeSend: setHeader).
        fail(function(resp)
          console.log('bad credentials.')
        ).
        done(function(resp)
        );

之后,我将会话存储在本地存储中。

但是,对于注销,我无法弄清楚如何使用此会话与请求标头一起发送,因此 django 的:request.logout() 注销具有该会话 ID 的用户

【问题讨论】:

【参考方案1】:

您正在使用HTTP Basic Authentication,它没有定义注销用户的方法。它与 Django 会话无关,因此您无法明确这一点。尽管浏览器可能会选择发送原始凭据(未经测试),但您可能会从会话存储中清除令牌并发送无效令牌。

在 Stack Overflow 上有 quite a few questions 关于它。您最好的选择是发送无效凭据,希望用户的浏览器会使所有保存的凭据无效。

您可以使用一种基于令牌的身份验证形式,例如TokenAuthentication 或OAuth,浏览器不会截获这些身份验证。这样您就无需担心用户退出,因为身份验证直接与使用令牌发出的请求相关联。

【讨论】:

【参考方案2】:

对于登录,您可以添加类似于此的视图:

import json
import requests
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect

@csrf_protect
def login(request):
    if request.method == "POST":
        login = requests.post('http://your_url/api-token-auth/', data='username': request.POST['username'], 'password': request.POST['password'])
        response = json.loads(login.text)
        if response.status_code == 200:
            token = response['token']
            request.session.flush()
            request.session['user'] = request.POST['username']

            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()

            return HttpResponseRedirect("/")

        else:
            error = "Error"
    request.session.set_test_cookie()
    return render_to_response("login.html", "error": error, RequestContext(request))

要注销,您只需在视图中执行以下操作:

def logout(request):
    request.session.flush()
    return HttpResponseRedirect('/')

在您的 API 方面,您必须在 url 中定义 api-token-auth:这里是 tutorial 以获取更多信息

url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token')

这样您将获得与 API 通信的令牌。除了 TokenAuthentication,您还可以定义和 SessionAuthentication。您可以在上面的教程中找到更多信息

【讨论】:

我的 request.session 对象是空的。我的疑问是 - 我如何在客户端形成请求对象,它将被发送到 Django REST API 在客户端存储请求对象可能很危险。有人可以劫持您的请求并以您的身份出现。 所以我应该以某种方式将每个登录用户的请求对象存储在服务器端?如果是,您能建议一种方法吗?

以上是关于Django REST API 注销请求的主要内容,如果未能解决你的问题,请参考以下文章

django rest框架json web token注销功能

当他从所有浏览器(Django-rest-auth,JWT)更改密码时如何注销用户?

通过 Keycloak REST API 注销用户不起作用

sendMessage IBM Bluemix PushNotification Rest API 正在注销设备

当我在标签之间导航时自动注销问题(Firebase Auth rest API)

Spring Boot JWT - 如何实现刷新令牌和注销 REST-API