Совместное использование аутентифицированных пользователей между Django и django-rest-framework в одном проекте

#python #django #django-rest-framework #python-requests

#python #django #django-rest-framework #python-запросы

Вопрос:

У меня есть проект Django, который в конечном итоге будет состоять из трех приложений. Два из которых будут «обычными» приложениями Django, третье — djangorestframework приложение. Я также планирую в какой-то момент создать настольный клиент для проекта.
Я хочу, чтобы приложение rest было единственным объектом, взаимодействующим с базой данных. Следовательно, я использую requests для связи с конечными точками rest из представлений «обычных» приложений Django, и я сделаю то же самое для настольного клиента.
Я хочу, чтобы все приложения были доступны только для аутентифицированных пользователей, поэтому я использую серверную часть аутентификации Django.

Мой вопрос заключается в том, как передать аутентифицированного пользователя / сеанс из приложений pure Django конечным точкам rest при использовании requests в представлениях.

Мне удалось пройти аутентификацию в rest API, используя request ‘s HTTPBasicAuth , но для этого мне необходимо иметь под рукой пароль пользователя в виде обычного текста. Конечно, я мог бы создать технического пользователя для выполнения этих запросов. Но это также означало бы, что каждый запрос должен был бы сначала проходить аутентификацию, а это не кажется лучшим подходом.

Я попытался извлечь файл cookie сеанса из request объекта, который предоставляется представлениям, и передать его через requests.get , но не смог правильно поместить его в requests.get вызов.

На данный момент использование запросов и установленных сеансов выглядит как мой лучший выбор, тем более, что именно так будет поступать и настольный клиент. Итак, в настоящее время я ищу правильный способ предоставить requests.get файл cookie сеанса, но я, безусловно, открыт для лучших решений.

Ответ №1:

Вы должны использовать токены.

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

И да, проверка подлинности должна происходить каждый раз, когда вы отправляете запрос. Чтобы ускорить работу, вы можете хранить токены в памяти. (Вы можете использовать redis или, возможно, даже загрузить свою базу данных в память или … ) но это правильный и распространенный способ для этого. Даже django выполняет эту проверку каждый раз, используя свои встроенные функции.

В документах DRF рекомендовано несколько пакетов для управления этими токенами:

DRF: Сторонние пакеты

Я использовал knox для многих проектов, и это довольно хорошо.

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

Большинство приложений используют токен в заголовках, которые вы можете просто добавить ко всем своим requests вызовам:

Запрашивает документы: пользовательские заголовки

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

1. Спасибо за ваш ответ. Я читал о token auth, но не чувствовал себя комфортно, используя его, поскольку я еще не изучил это достаточно, чтобы полностью понять, как это работает. Я обязательно попробую. Да, проверки подлинности должны выполняться для каждого запроса. Я имел в виду, что при использовании BasicAuth пользователь будет (повторно) аутентифицироваться для каждого запроса, тогда как при использовании сеансов (или токенов, если уж на то пошло) это сводилось бы к проверке того, является ли предоставленный сеанс (или токен) действительным.

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