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)更改密码时如何注销用户?
sendMessage IBM Bluemix PushNotification Rest API 正在注销设备