#django #nginx #proxy #reverse-proxy #nginx-reverse-proxy
#django #nginx #прокси #обратный прокси #nginx-обратный прокси
Вопрос:
У меня есть веб-сервер nginx, который настроен на аутентификацию по сертификату клиента. После проверки подлинности я отправляю прокси-запросы на сервер приложений uWSGI Django. Я настроил свое приложение Django для выполнения аутентификации с использованием REMOTE_USER (https://docs.djangoproject.com/en/3.1/howto/auth-remote-user /), однако, похоже, это не работает, поскольку я получаю сообщение об ошибке «объект ‘AnonymousUser’ не является итеративным» от Django.
Я предполагаю, что мне чего-то не хватает в моей конфигурации nginx:
server {
listen 80;
server_name my.website.net;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/my.website.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/my.website.net/privkey.pem;
ssl_verify_client on;
ssl_verify_depth 2;
ssl_client_certificate /etc/nginx/ssl/cas.pem;
proxy_set_header X-SSL-Client-Serial $ssl_client_serial;
proxy_set_header X-SSL-Client-Verify $ssl_client_verify;
proxy_set_header X-SSL-Client-S-DN $ssl_client_s_dn;
proxy_set_header X-Remote-User $remote_user;
proxy_set_header REMOTE_USER $remote_user;
location / {
root /var/www/my.website.net;
index index.html index.htm;
}
location /django {
proxy_set_header Host 10.101.10.228;
proxy_http_version 1.1;
proxy_set_header Connection "Keep-Alive";
proxy_set_header Proxy-Connection "Keep-Alive";
proxy_pass http://10.101.10.228:8000/webapp;
proxy_redirect http://10.101.10.228/django/ https://my.website.net/django/;
}
}
Я также пытался использовать директивы nginx uwsgi_ *, но безуспешно:
upstream django {
server 10.101.10.228:8000;
}
location /django {
include uwsgi_params;
uwsgi_pass django;
uwsgi_param SCRIPT_NAME /webapp;
uwsgi_param REMOTE_USER $remote_user;
uwsgi_param X-REMOTE-USER $remote_user;
}
Кажется, что чего-то не хватает?
Комментарии:
1. Он обязательно должен работать с uwsgi_params, а не через заголовки. Однако заполнен ли $remote_user, потому что аутентификация по сертификату клиента — это не то же самое, что базовая аутентификация. Вы можете записать переменную в журнал nginx, если не уверены, используя log_format .
Ответ №1:
Переменная $remote_user
nginx заполняется только для базовой аутентификации HTTP. Вы можете полагаться на $ssl_client_s_dn
переменную, чтобы использовать DN клиента в качестве имени пользователя:
proxy_set_header Remote_User $ssl_client_s_dn;
или
uwsgi_param REMOTE_USER $ssl_client_s_dn;
Вы можете использовать map
блок для восстановления только некоторого определенного поля из DN клиента, например, для получения только CN (канонического имени):
map $ssl_client_s_dn $remote_user_cn {
~,CN=(?<CN>[^,] ) $CN;
}
а затем используйте $remote_user_cn
переменную в качестве имени пользователя.
Комментарии:
1. Вы правы, $remote_user не устанавливался автоматически, поэтому я использовал $ssl_client_s_dn (используя uwsgi_pass). Спасибо!