Usando a Autenticação Básica do Postgres no NGINX para adicionar o resultado da consulta ao Cabeçalho HTTP do Proxy

7

Estamos tentando usar o módulo ngx_postgres para fazer autenticação básica através do NGINX. Queremos recuperar um valor do par de resultados da consulta e adicioná-lo ao cabeçalho HTTP e, em seguida, procurá-lo para outro servidor.

Conseguimos autenticar através do postgres, mas o problema passou o par de resultados para o proxy. O código que estamos usando atualmente é o seguinte:

    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/;

    }

Este é um subconjunto de muitas coisas diferentes que tentamos. O problema neste exemplo é que query_val parece ser destruído na sub solicitação. Conseguimos recuperar o par de resultados da consulta quando a chamada de postgres não está em uma subrequição, mas isso desativa nossa autenticação.

Também tentamos uma consulta simples no local principal e, em seguida, fizemos proxy desses dados para outro local, mas ele falhou. O par de resultados da consulta seria adicionado ao arquivo de cabeçalho corretamente se o direcionássemos para um recurso local como um arquivo index.html, mas assim que tentássemos incluí-lo no cabeçalho http e enviá-lo ao proxy, ele não seria existem mais.

Qualquer conselho sobre este assunto seria muito apreciado.

[Update] Passei o dia todo lendo sobre os módulos que estou usando, e realmente acho que é um problema com a ordem de fase dos módulos. Tenho a sensação de que a reescrita do proxy está ocorrendo antes que a subsequação de autenticação postgres tenha realmente retornado um resultado. Eu continuarei investigando. Qualquer ajuda ainda é apreciada.

    
por user669615 03.04.2013 / 19:02

1 resposta

7

A solução para este problema acabou usando a função auth_request_set para extrair o valor correto durante a fase NGINX apropriada. O código a seguir é a solução de trabalho.

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/;

}
    
por 04.04.2013 / 20:00