Непоследовательное поведение с auth_request_set и more_set_input_headers Nginx

Я пытаюсь использовать auth_request модуль в сочетании с more_set_input_headers для автоматического входа в систему в моих пользователей в веб-приложения.

В основном это работает как это:

  1. У пользователей есть некоторые сеансовые куки, которые аутентифицируют их.
  2. У меня есть Сценарий PHP (auth.php), который проверяет cookie и возвращает их надлежащее имя пользователя как заголовок ответа.
  3. Nginx называет auth.php с auth_request и устанавливает имя пользователя в переменной.
  4. Nginx затем называет веб-приложение с набором заголовка запроса к корректному имени пользователя.
  5. Веб-приложение читает заголовок и регистрирует пользователя в.

Это работает, но странно непоследовательный. Проблема - то, что, когда пользователь получает доступ к веб-приложению на / приложении/, оно работает, но когда к приложению получают доступ на/app/index.php, оно никогда не получает заголовок от nginx.

Я создал ложную конфигурацию, которая воспроизводит ошибку.

Конфигурация сайта Nginx:

server {
    server_name www.example.com
    index index.php index.html;

    # --- Internal auth
    location /auth {
        internal;
        root /var/www/sf;

        location /auth/auth.php {
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include includes/fastcgi_params;

            fastcgi_pass_request_body off;
            fastcgi_param CONTENT_LENGTH 0;
        }

        location /auth {
            deny all;
        }
    }

    location / {

        auth_request /auth/auth.php;

        auth_request_set $auth_header $upstream_http_x_auth_header;
        more_set_input_headers 'X-Test-Header: $auth_header';

        location /app {
            root /var/www/sf;

            # Allow these locations
            location = /app/ {
                allow all;
            }

            location /app/index.php {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                include includes/fastcgi_params;
            }

            # Deny everything else
            location /app/ {
                deny all;
            }
        }

    }
}

/var/www/sf/auth/auth.php:

<?php

// Mock precondition checker
function is_allowed() {
    return true;
}

// Set the default response code
http_response_code(403);

if(!is_allowed())
    exit();

// Return our header and the OK response code
header("X-Auth-Header: myusername");
http_response_code(200);

/var/www/sf/app/index.php:

<?php

if(empty($_SERVER["HTTP_X_TEST_HEADER"]))
    exit("No header was supplied by nginx.");

exit("Nginx supplied header value: ". $_SERVER["HTTP_X_TEST_HEADER"]);

Ответ при выполнении ПОЛУЧИТЬ запроса к/app/:

Nginx supplied header value: myusername

Ответ при выполнении ПОЛУЧИТЬ запроса к/app/index.php:

No header was supplied by nginx.

У кого-либо была бы идея относительно того, что продолжается здесь?

Я использую Debian Хрипящий с пакетом nginx-отдельно-оплачиваемых-предметов от (1.6.0-1~dotdeb.1) DotDeb.

(маленькое примечание: когда Вы заменяете 'more_set_input_headers 'X-испытательный-коллектор: $auth_header''; с 'more_set_input_headers 'X-испытательный-коллектор: foobar''; веб-приложение всегда получает заголовок),

0
задан 28 June 2014 в 15:56
1 ответ

Такое поведение, вероятно, связано с тем, что more_set_input_headers обработчик выполняется перед фазой доступа. (где работает auth_request), и, следовательно, изменяет запрос только в том случае, если он внутренне перенаправлен.

Решение проблемы - прекратить использование more_set_input_headers. (в любом случае, это очень неправильно, заголовки запросов не должны меняться) и use native fastcgi_param instead:

fastcgi_param HTTP_X_TEST_HEADER $auth_header;

Copied from http://mailman.nginx.org/pipermail/nginx/2014-June/044281.html.

1
ответ дан 4 December 2019 в 17:28

Теги

Похожие вопросы