【问题标题】:Django REST API Logout requestDjango REST API 注销请求
【发布时间】: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 的用户

【问题讨论】:

    标签: javascript django django-rest-framework django-users django-sessions


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案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
      • 在客户端存储请求对象可能很危险。有人可以劫持您的请求并以您的身份出现。
      • 所以我应该以某种方式将每个登录用户的请求对象存储在服务器端?如果是,您能建议一种方法吗?
      猜你喜欢
      • 2015-06-28
      • 1970-01-01
      • 2019-02-25
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      相关资源
      最近更新 更多