Zwischenspeichern von Nginx Auth_Request

Zwischenspeichern von Nginx Auth_Request

Ich versuche, einen Nginx- 1.12.2Reverse-Proxy zu konfigurieren, um Anfragen an einen Microservice zu verwenden auth_requestund proxy_cachezu authentifizieren. Endbenutzer senden ein einfaches BearerToken mit ihrer Anfrage und der Server versucht, damit eine Ressource abzurufen, um festzustellen, ob sie fortfahren dürfen. Dieser Ressourcenabruf sollte für ein bestimmtes Token zwischengespeichert werden, um den Authentifizierungsendpunkt zu entlasten. Hier ist meine bisherige Konfiguration:

ssl_certificate                 /etc/nginx/ssl/certificate;
ssl_certificate_key             /etc/nginx/ssl/key;
proxy_cache_path                /var/cache/nginx/auth_cache levels=1:2 keys_zone=auth_cache:1m max_size=1g inactive=60m;
server {
    listen                      80;
    listen                      443 ssl;
    server_name                 myapi.mydomain.com;
    location / {
        proxy_pass              http://myapi/;
        auth_request            /auth;
    }
    location = /auth {
        internal;
        proxy_pass              https://authendpoint.mydomain.com/api/user/verify;
        proxy_cache             auth_cache;
        proxy_cache_key         "$http_x_auth_token$request_uri";            
        proxy_pass_request_body off;
        proxy_set_header        Content-Length "";
        proxy_set_header        X-Original-URI $request_uri;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Aus Client-Sicht funktioniert das großartig, aber wenn ich mir den Nginx-Server anschaue, wird nie etwas in den Cache-Ordner geschrieben. Der Ordner /var/cache/nginx/auth_cachewird erstellt, ist aber immer leer. Was könnte ich übersehen haben?

aktualisieren

Wenn wir dies mit neuerem nginx ( 1.17.9, derzeit) versuchen, sehen wir immer noch nichts, was in den Cache-Ordner geschrieben wird. An anderer Stelle habe ich den Hinweis gesehen, dass Cookies das Caching blockieren könnten – diese App verwendet keine Cookies, aber wir haben es trotzdem versucht:

location = /auth {
    internal;
    proxy_pass              http://authservice/api/user/verify;
    proxy_cache             auth_cache;
    proxy_cache_key         "$http_x_auth_token$request_uri";   
    proxy_pass_request_body off;
    proxy_set_header        Content-Length "";
    proxy_set_header        X-Original-URI $request_uri;
    proxy_hide_header       Set-Cookie;
    proxy_ignore_headers    Set-Cookie;
    proxy_set_header        Cookie "";
}

Immer noch das gleiche Verhalten; der Ordner „auth_cache“ wird erstellt, aber es wird nie etwas dorthin geschrieben und Anfragen an unseren Authentifizierungsendpunkt werden nicht zwischengespeichert.

Nur als Referenz: Die Ergebnisse von unserem Authentifizierungsendpunkt sind äußerst minimal:

< HTTP/1.1 200 OK
< Date: Sun, 12 Apr 2020 18:04:08 GMT
< Server: Kestrel
< Content-Length: 0

Wir haben auch den Remote-Authentifizierungsendpunkt vereinfacht, seit ich diese Frage ursprünglich gestellt habe. Jetzt ist es eine einfache httpRessource, die im selben Cluster wie der Nginx-Prozess ausgeführt wird. Ich habe das obige Beispiel aktualisiert, um dies widerzuspiegeln.

letztes Update

Für den unwahrscheinlichen Fall, dass jemand anderes dies als Referenz verwenden möchte, mussten wir zusätzlich zu den beiden hilfreichen Antworten unten den Cache-Schlüssel im obigen Beispiel korrigieren:

proxy_cache_key         "$http_x_auth_token$request_uri";            

Macht nur Sinn, wenn Sie es tatsächlich X-Auth-Tokenals Header und nicht nur verwenden Authorization. Der obige Schlüssel funktioniert, aber das bedeutet, dass die erste Authentifizierungsantwort über den Proxy für jede URI zwischengespeichert wird und das eigentliche Token ignoriert wird. Wir brauchten wirklich:

proxy_cache_key         "$http_authorization$request_uri";            

Antwort1

Versuchen Sie, NGINX zu aktualisieren.

Ich hatte das gleiche Problem mit 1.14.0, wo manuelle Anfragen an /auth mit curl zwischengespeichert wurden, auth_request-Unteranfragen jedoch nicht.

Nach dem Upgrade auf NGINX 1.16.1 begann es zu funktionieren.

Antwort2

Ich kann keine Kommentare hinterlassen, weil ich neu bin, aber die Proxy_ignore_headers könnten Ihnen helfen.

proxy_ignore_headers Expires Cache-Control;

Laut der Nginx-Dokumentation; Deaktiviert die Verarbeitung bestimmter Antwortheaderfelder vom Proxyserver.

Wenn Ihr App-Server Anweisungen zum „Kein Caching“ zurückgibt, wird Nginx diese berücksichtigen. Durch Ignorieren dieser Header werden sämtliche Caching-Anweisungen ignoriert.

Außerdem: Wie ist der Cache-Status in den HTTP-Antwortheadern von Nginx auf dem Client-Rechner? BYPASS führt dazu, dass Nginx ihn nicht zwischenspeichert.

Nochmals, es tut mir leid, dass ich keinen Kommentar hinterlassen kann, aber ich wollte helfen, wenn ich konnte.

verwandte Informationen