Назад | Перейти на главную страницу

NGINX застрял в бесконечном цикле перенаправления при попытке использовать auth_request

версия 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" чтобы фляга знала, как хранить сеанс через поддомены