версия nginx: 1.14.2
Я пытаюсь использовать nginx auth_request для аутентификации пользователей для доступа к субдомену, на котором обслуживается страница, на которую я не могу иначе повлиять.
У меня есть страница входа на основе python + flask, которая возвращает 200, если пользователь вошел в систему, и возвращает 401, если пользователь не вошел в систему.
Я настроил поддомен proxy_pass в nginx следующим образом:
server {
listen 80;
server_name sub.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name sub.example.com;
location / {
auth_request /myauth;
auth_request_set $auth_status $upstream_status;
proxy_pass http://localhost:8001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location = /myauth {
proxy_pass https://login.example.com/;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
error_page 401 = @error401;
location @error401 {
return 302 https://login.example.com/login/?next=https://$http_host$request_uri ;
}
}
Конфигурация nginx для страницы входа выглядит так:
server {
listen 80;
server_name login.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name login.example.com;
client_max_body_size 128M;
location / {
include uwsgi_params;
uwsgi_pass unix:/srv/loginpage/loginpage.sock;
}
}
Вот как выглядит мой журнал доступа:
[24/Dec/2019:04:17:28 +0100] "login.example.com" "GET /login/?next=https://sub.example.com/ HTTP/2.0" 302 263
[24/Dec/2019:04:17:28 +0100] "login.example.com" "GET / HTTP/1.0" 401 10
[24/Dec/2019:04:17:28 +0100] "sub.example.com" "GET / HTTP/2.0" 302 161
[24/Dec/2019:04:17:28 +0100] "login.example.com" "GET /login/?next=https://sub.example.com/ HTTP/2.0" 302 263
[24/Dec/2019:04:17:28 +0100] "login.example.com" "GET / HTTP/1.0" 401 10
[24/Dec/2019:04:17:28 +0100] "sub.example.com" "GET / HTTP/2.0" 302 161
[24/Dec/2019:04:17:28 +0100] "login.example.com" "GET /login/?next=https://sub.example.com/ HTTP/2.0" 302 263
[24/Dec/2019:04:17:28 +0100] "login.example.com" "GET / HTTP/1.0" 401 10
[24/Dec/2019:04:17:28 +0100] "sub.example.com" "GET / HTTP/2.0" 302 161
Журнал отладки можно найти здесь: https://gist.github.com/laundmo/c23345061940bbef59703d43e93a9ba0
Система входа в систему работает, я могу войти в систему и получить ответ 200 на https://login.example.com/
, если я выхожу из системы, меня перенаправляют на страницу входа, даже при доступе sub.example.com
при выходе из системы. Обратное направление тоже, кажется, работает. Просто по какой-то причине, как только меня перенаправят обратно на sub.example.com
меня перенаправляют на login.example.com
который перенаправляет меня на sub.example.com
и так далее...
изменить: если это принадлежит другой странице stackexchange, скажите мне, и я удалю это и переместу туда
в конце концов это было так просто
приложение фляги, которое я пытался использовать в качестве аутентификатора, не сохраняло сеанс через поддомены
если кто-то еще попытается это сделать, обязательно включите app.config["SESSION_COOKIE_DOMAIN"] = ".example.com"
чтобы фляга знала, как хранить сеанс через поддомены