Almacenamiento en caché de nginx auth_request

Almacenamiento en caché de nginx auth_request

Estoy intentando configurar un 1.12.2proxy inverso nginx para usar auth_requesty proxy_cacheautenticar solicitudes en un microservicio. Los usuarios finales envían un token simple Bearercon su solicitud y el servidor intenta obtener un recurso con él para determinar si pueden continuar. Esa recuperación de recursos debe almacenarse en caché para un token determinado para aliviar la carga del punto final de autenticación. Aquí está mi configuración hasta el momento:

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

Desde la perspectiva del cliente, esto funciona muy bien, pero cuando miro el servidor nginx, nunca se escribe nada en la carpeta de caché. La carpeta /var/cache/nginx/auth_cachese crea, pero siempre está vacía. ¿Qué podría faltarme?

actualizar

Al intentar esto con el nginx más nuevo ( 1.17.9actualmente), todavía nunca vemos nada escrito en la carpeta de caché. En otra parte vi la sugerencia de que las cookies podrían bloquear el almacenamiento en caché; esta aplicación no usa cookies, pero lo intentamos de todos modos:

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 "";
}

Sigue siendo el mismo comportamiento; Se crea la carpeta auth_cache, pero nunca se escribe nada allí y las solicitudes a nuestro punto final de autenticación no se almacenan en caché.

Solo como referencia, los resultados de nuestro punto final de autenticación son extremadamente mínimos:

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

También hemos simplificado el punto final de autenticación remota desde que hice esta pregunta originalmente. Ahora, es un httprecurso simple que se ejecuta dentro del mismo clúster que el proceso nginx. Actualicé el ejemplo anterior para reflejar eso.

actualización final

En caso de que alguien más intente usar esto como referencia, además de las dos respuestas útiles a continuación, necesitábamos corregir la clave de caché en el ejemplo anterior:

proxy_cache_key         "$http_x_auth_token$request_uri";            

Solo tiene sentido si realmente lo estás usando X-Auth-Tokencomo encabezado y no solo Authorization. La clave anterior funcionará, pero significa que la primera respuesta de autenticación proxy para cualquier uri se almacenará en caché y se ignorará el token real. Realmente necesitábamos:

proxy_cache_key         "$http_authorization$request_uri";            

Respuesta1

Intente actualizar NGINX.

Tuve el mismo problema con 1.14.0, donde las solicitudes manuales a /auth con curl se almacenaban en caché, pero las subsolicitudes auth_request no.

Después de actualizar a NGINX 1.16.1, comenzó a funcionar.

Respuesta2

No puedo dejar comentarios porque soy nuevo, pero proxy_ignore_headers pueden ayudarte.

proxy_ignore_headers Expires Cache-Control;

Según los documentos de Nginx; Deshabilita el procesamiento de ciertos campos del encabezado de respuesta del servidor proxy.

Si su servidor de aplicaciones devuelve instrucciones "sin almacenamiento en caché", Nginx las respetará; al ignorar estos encabezados, se ignoran todas las instrucciones de almacenamiento en caché.

Además, ¿cuál es el estado de la caché en los encabezados de respuesta http de Nginx en la máquina del cliente? BYPASS hará que nginx no lo almacene en caché.

Una vez más, lamento no poder dejar un comentario, pero quería ayudar si pudiera.

información relacionada