Cache nginx auth_request

Cache nginx auth_request

Estou tentando configurar um 1.12.2proxy reverso nginx para usar auth_requeste proxy_cacheautenticar solicitações para um microsserviço. Os usuários finais enviam um token simples Bearercom sua solicitação e o servidor tenta buscar um recurso com ele para determinar se eles têm permissão para prosseguir. Essa busca de recursos deve ser armazenada em cache para um determinado token para aliviar a carga do terminal de autenticação. Aqui está minha configuração até agora:

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

Do ponto de vista do cliente, isso está funcionando muito bem, mas quando olho para o servidor nginx, nada é gravado na pasta de cache. A pasta /var/cache/nginx/auth_cacheé criada, mas está sempre vazia. O que poderia estar faltando?

atualizar

Tentando isso com o nginx ( 1.17.9, atualmente) mais recente, ainda nunca vemos nada gravado na pasta de cache. Em outro lugar, vi a sugestão de que os cookies poderiam bloquear o cache - este aplicativo não usa cookies, mas tentamos mesmo assim:

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

Ainda o mesmo comportamento; a pasta auth_cache é criada, mas nada é escrito lá e as solicitações para nosso endpoint de autenticação não são armazenadas em cache.

Apenas para referência, os resultados do nosso endpoint de autenticação são extremamente mínimos:

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

Também simplificamos o endpoint de autenticação remota desde que fiz essa pergunta originalmente. Agora, é um httprecurso simples executado no mesmo cluster que o processo nginx. Atualizei o exemplo acima para refletir isso.

atualização final

Caso outra pessoa tente usar isso como referência, além das duas respostas úteis abaixo, precisávamos corrigir a chave de cache no exemplo acima:

proxy_cache_key         "$http_x_auth_token$request_uri";            

Só faz sentido se você estiver realmente usando X-Auth-Tokencomo cabeçalho e não apenas Authorization. A chave acima funcionará, mas significa que a primeira resposta de autenticação com proxy para qualquer uri será armazenada em cache e o token real será ignorado. Realmente, precisávamos:

proxy_cache_key         "$http_authorization$request_uri";            

Responder1

Tente atualizar o NGINX.

Eu tive o mesmo problema com 1.14.0, onde as solicitações manuais para /auth com curl eram armazenadas em cache, mas as subsolicitações auth_request não.

Após a atualização para o NGINX 1.16.1 ele começou a funcionar.

Responder2

Não posso deixar comentários porque sou novo, mas proxy_ignore_headers pode ajudá-lo.

proxy_ignore_headers Expires Cache-Control;

De acordo com os documentos do Nginx; Desativa o processamento de determinados campos de cabeçalho de resposta do servidor proxy.

Se o servidor do seu aplicativo estiver retornando instruções "sem cache", o Nginx irá honrá-las, ignorando esses cabeçalhos, todas as instruções de cache serão ignoradas.

Além disso, qual é o status do cache nos cabeçalhos de resposta http do Nginx na máquina do cliente. BYPASS fará com que o nginx não o armazene em cache.

Mais uma vez, desculpe, não posso deixar um comentário, mas queria ajudar se pudesse.

informação relacionada