Ich versuche, einen Nginx- 1.12.2
Reverse-Proxy zu konfigurieren, um Anfragen an einen Microservice zu verwenden auth_request
und proxy_cache
zu authentifizieren. Endbenutzer senden ein einfaches Bearer
Token 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_cache
wird 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 http
Ressource, 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-Token
als 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.