0

Для входа в систему, я делаю что-то вроде:запрос 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){ 
     }); 

, после чего я хранить сессию в локальном хранилище.

Однако для выхода из, я не могу понять, как использовать эту сессию для отправки с заголовка запроса, так что Джанго: request.logout() журналы из пользователей, имеющих этот идентификатор сеанса

ответ

1

Для входа в систему вы можете добавить вид, подобный этому:

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, вы должны Defi пе апи-маркера аутентификации в URLs: вот tutorial для получения дополнительной информации

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

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

+0

Мой объект request.session пуст. Мое сомнение заключается в том, как создать объект запроса на стороне клиента, который будет отправлен API Django REST –

+0

Сохранение объекта запроса на стороне клиента может быть опасным. Кто-то может захватить ваш запрос и представить себя как вы. – Sasa

+0

Так что я должен каким-то образом сохранить объект запроса за вход в систему пользователя на стороне сервера? Если да, можете ли вы предложить способ сделать это? –

1

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

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

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

Смежные вопросы