Гибридное приложение Django — аутентификация по REST API

#javascript #python #django #authentication #django-rest-framework

#javascript #python #django #аутентификация #django-rest-framework

Вопрос:

Я новичок в Django и создал базовое приложение (Django 3.1), которое использует аутентификацию сеанса и простую страницу входа (имя пользователя пароль) для входа пользователя django. Все работает нормально. Я хотел бы использовать javascript (vue.js ) на страницах, доступных зарегистрированному пользователю для вызова API Django REST, размещенных в том же приложении Django.

Несмотря на множество поисковых запросов, никто, похоже, не приводит четкого примера аутентификации гибридного приложения Django, дополненного API. Я уже использовал множество API, поэтому знаком с параметрами аутентификации. Моя проблема заключается в том, как безопасно получить учетные данные для javascript, загруженного шаблонами django.

В идеале я хотел бы:

  1. Пользователь входит в систему с именем пользователя / паролем
  2. django перенаправляет на СТРАНИЦУ B, АВТОМАТИЧЕСКИ КАКИМ-ТО ОБРАЗОМ вставляя токен пользователя в cookie / sessionStorage
  3. Функция javascript на СТРАНИЦЕ B получает учетные данные из cookie / sessionStorage и вызывает API (используя все различные опции, поддерживаемые django-rest-framework)

Мои вопросы:

Вопрос 1 ==> в моей функции просмотра do_login (ниже) после успешной аутентификации с помощью встроенного в Djangos метода входа в систему, нужно ли мне создавать cookie в HttpResponse (например, token = XXXXXXX), чтобы javascript мог получить к нему доступ? Безопасно ли это?

     def do_login(request):
       ....
       login(request, user)
       ...
       #create token here and return to user somehow in cookie/sessionStorage
       return render(request, 'hello/logged_in_ok.html')
  

Итак, мой javascript может делать что-то вроде этого (только демонстрационный код):

 function onButtonClick(){
    let token = sesssionStorage.getItem("django_gave_me_this_token");
    let response = callGetAPISomehow(token, "https://demo/rest/api/account/1")
    .....
}
  

Вопрос 2 ==> Большинство методов просмотра заканчиваются:

     return render(request, 'blah/blah.html', {'data': blah})
  

Как мне установить cookie в ответе таким образом? Нет объекта ответа для доступа.

Любая помощь приветствуется

Комментарии:

1. Используете ли вы фреймворк Django REST? Если вы используете конфигурацию сеансов Django по умолчанию, сеансы через AJAX должны работать «из коробки» (см. Документы: django-rest-framework.org/topics/ajax-csrf-cors )

2. Да, платформа Django REST