Запрос на выход из Django REST API

Для входа в систему я делаю что-то вроде:

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() выходит из системы пользователя, имеющего этот идентификатор сеанса


person Saurabh Verma    schedule 27.10.2014    source источник


Ответы (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 вы должны определить api-token-auth в URL-адресах: вот руководство для получения дополнительной информации

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

Таким образом вы получите свой токен для связи с API. Помимо TokenAuthentication вы можете определить и SessionAuthentication. Подробнее об этом вы можете узнать из приведенного выше руководства.

person Sasa    schedule 27.10.2014
comment
Мой объект request.session пуст. Я сомневаюсь, как мне сформировать объект запроса на стороне клиента, который будет отправлен в Django REST API. - person Saurabh Verma; 27.10.2014
comment
Хранение объекта запроса на стороне клиента может быть опасным. Кто-то может перехватить вашу просьбу и представиться вами. - person Sasa; 27.10.2014
comment
Итак, я должен каким-то образом сохранить объект запроса для каждого зарегистрированного пользователя на стороне сервера? Если да, не могли бы вы предложить способ сделать это? - person Saurabh Verma; 27.10.2014

Вы используете базовую аутентификацию HTTP, которая не определяет способ выхода пользователей из системы. Он не привязан к сеансу Django, поэтому вы не можете его очистить. Вы потенциально можете удалить токен из хранилища сеанса и отправить недействительный токен, хотя браузер может выбрать отправку исходных учетных данных (непроверенных).

Есть довольно несколько вопросы об этом в Stack Overflow. Ваш лучший вариант выглядит как отправка недействительных учетных данных в надежде, что браузер пользователя сделает недействительными все сохраненные.

Вы можете использовать форму аутентификации на основе токенов, такую ​​как TokenAuthentication или OAuth, которые не будут перехватывается браузером. Таким образом, вам не нужно беспокоиться о выходе пользователей из системы, поскольку аутентификация напрямую связана с запросами, сделанными с помощью токена.

person Kevin Brown    schedule 27.10.2014