Мы пытаемся использовать модуль 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/;
}