Verwenden von Postgres Basic Auth in NGINX zum Hinzufügen des Abfrageergebnisses zum Proxy-HTTP-Header

7

Wir versuchen, das Modul ngx_postgres zu verwenden, um eine grundlegende Authentifizierung über NGINX durchzuführen. Wir möchten einen Wert aus dem Abfrageergebnispaar abrufen, ihn dem HTTP-Header hinzufügen und diesen dann an einen anderen Server weiterleiten.

Es ist uns gelungen, uns über Postgres zu authentifizieren, aber das Problem hat das Ergebnispaar an den Proxy übergeben. Der Code, den wir derzeit verwenden, lautet wie folgt:

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

    }

Dies ist eine Teilmenge vieler verschiedener Dinge, die wir versucht haben. Das Problem in diesem Beispiel ist, dass query_val innerhalb der Unteranforderung zerstört zu sein scheint. Wir können das Abfrageergebnispaar erfolgreich abrufen, wenn sich der Postgres-Aufruf nicht in einer Unteranforderung befindet, dies jedoch unsere Authentifizierung deaktiviert.

Wir haben auch versucht, eine einfache Abfrage am Hauptspeicherort durchzuführen und diese Daten dann an den anderen Speicherort weiterzuleiten, aber dies ist fehlgeschlagen. Das Abfrageergebnispaar würde der Header-Datei korrekt hinzugefügt, wenn wir es an eine lokale Ressource wie eine index.html-Datei weiterleiten würden. Sobald wir jedoch versuchten, es dem http-Header hinzuzufügen und an den Proxy zu senden, würde dies nicht der Fall sein länger existieren.

Jeder Rat in dieser Angelegenheit wäre sehr dankbar.

[Update] Ich habe den ganzen Tag über die Module gelesen, die ich verwende, und ich denke wirklich, dass es ein Problem mit der Phasenreihenfolge der Module ist. Ich habe das Gefühl, dass das Umschreiben des Proxys stattfindet, bevor die Unteranforderung zur Postgres-Authentifizierung tatsächlich ein Ergebnis zurückgegeben hat. Ich werde weiter nachforschen. Jede Hilfe wird immer noch geschätzt.

user669615
quelle

Antworten:

7

Die Lösung für dieses Problem bestand darin, die Funktion auth_request_set zu verwenden, um während der richtigen NGINX-Phase den richtigen Wert herauszuholen. Der folgende Code ist die Arbeitslösung.

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

}
user669615
quelle