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

Использование Postgres Basic Auth в NGINX для добавления результата запроса в HTTP-заголовок прокси

Мы пытаемся использовать модуль ngx_postgres для базовой аутентификации через NGINX. Мы хотим получить значение из пары результатов запроса и добавить его в заголовок HTTP, а затем передать его другому серверу.

Нам удалось пройти аутентификацию через postgres, но проблема заключалась в передаче пары результатов на прокси. Код, который мы сейчас используем, выглядит следующим образом:

    location = /test_auth {
            internal;

            postgres_escape $user $remote_user;
            postgres_escape $pass $remote_passwd;

            postgres_pass geo_database;

            postgres_query "select user_name,contract_id,access_token from schema_name.table_name where user_name=$user and password=md5($pass);";
            postgres_rewrite no_rows 401;
            more_set_headers -s 401 'WWW-Authenticate: Basic realm="Restricted"';
            postgres_output none;
            postgres_set $query_val 0 0 required;
    }

    location /test/ {
           auth_request /test_auth;

           proxy_pass      http://back_end_server/public-dev/;
           proxy_set_header test $query_val;
           proxy_redirect http://back_end_server/public-dev/ http://example_domain.com/;

    }

Это подмножество множества разных вещей, которые мы пробовали. Проблема в этом примере заключается в том, что query_val, по-видимому, уничтожается во вложенном запросе. Мы успешно можем получить пару результатов запроса, когда вызов postgres не входит в подзапрос, но это отключает нашу аутентификацию.

Мы также попробовали выполнить простой запрос в основном месте, а затем проксировать эти данные в другое место, но это не удалось. Пара результатов запроса была бы правильно добавлена ​​в файл заголовка, если бы мы направили ее на локальный ресурс, такой как файл index.html, но как только мы попытаемся добавить ее в заголовок http и отправить на прокси-сервер, он не будет больше существовать.

Будем признательны за любые советы по этому поводу.

[Обновить] Я весь день читал о модулях, которые использую, и я действительно думаю, что это проблема с порядком фаз модулей. У меня такое ощущение, что перезапись прокси происходит до того, как подзапрос аутентификации postgres фактически вернул результат. Я продолжу расследование. Любая помощь по-прежнему приветствуется.

Решением этой проблемы стало использование функции auth_request_set для извлечения правильного значения во время правильной фазы NGINX. Следующий код - рабочее решение.

location = /test_auth {
        internal;

        postgres_escape $user $remote_user;
        postgres_escape $pass $remote_passwd;

        postgres_pass geo_database;

        postgres_query "select user_name,contract_id,access_token from schema_name.table_name where user_name=$user and password=md5($pass);";
        postgres_rewrite no_rows 401;
        more_set_headers -s 401 'WWW-Authenticate: Basic realm="Restricted"';
        postgres_output none;
        postgres_set $query_val 0 0 required;
}

location /test/ {
       auth_request /test_auth;
       auth_request_set $proper_query_val $query_val;

       proxy_pass      http://back_end_server/public-dev/;
       proxy_set_header test $proper_query_val;
       proxy_redirect http://back_end_server/public-dev/ http://example_domain.com/;

}