web-dev-qa-db-ja.com

NGINXでPostgres基本認証を使用してクエリ結果をプロキシ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ヘッダーに追加してプロキシに送信しようとすると、すぐに追加されません。もう存在します。

この件に関するアドバイスをいただければ幸いです。

[Update]使用しているモジュールについて一日中読んでいますが、モジュールのフェーズ順序の問題だと思います。 postgres認証サブリクエストが実際に結果を返す前にプロキシの書き換えが行われているように感じます。今後も調査を続けていきます。どんな助けでも大歓迎です。

7
user669615

この問題の解決策は、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/;

}
7
user669615