Посмотрите на REMOTE_USER-аутентификацию :
В этом документе описывается, как использовать внешние источники аутентификации (где веб-сервер устанавливает переменную среды REMOTE_USER) в вашем DjangoПриложения. Этот тип решения для проверки подлинности обычно встречается на сайтах интрасети с решениями с единым входом, такими как IIS и встроенная проверка подлинности Windows или Apache и mod_authnz_ldap, CAS, Cosign, WebAuth, mod_auth_sspi и т. Д.
В основномваш "легкий" сервер выполняет аутентификацию, как он уже делает. Когда вы делаете запрос к вашему «тяжелому» серверу, вы должны установить заголовок Auth-User
, содержащий имя пользователя вашего пользователя. Затем Django автоматически аутентифицирует соответствующего пользователя.
По умолчанию Django считывает переменную среды, установленную сервером аутентификации. Но вместо этого мы можем заставить его работать с HTTP-заголовком:
# middlewares.py
from django.contrib.auth.middleware import RemoteUserMiddleware
class CustomHeaderMiddleware(RemoteUserMiddleware):
header = 'HTTP_AUTH_USER'
# settings.py
MIDDLEWARE = [
'...',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'my_project.middlewares.CustomHeaderMiddleware',
'...',
]
Затем вы можете сделать что-то подобное в своем запросе (при условии, что у вас есть Django user
под рукой):
s = requests.Session()
r1 = s.get(upload_process_url)
a = s.post(
upload_process_url,
files=request.FILES,
headers={
'Auth-User': user.username,
},
)
Поскольку вы не выполняете запрос из браузера, вы можете избежать защиты от CSRF, пометив так называемое «тяжелое» представление с помощью декоратора @csrf_exempt
(как вы сами обнаружили).
Будьте осторожны, чтобы ваш «тяжелый» сервер не был доступен напрямую через Интернет и всегда находился за прокси / VPN, доступным только вашему «легкому» серверу.