Estou tentando configurar um 1.12.2
proxy reverso nginx para usar auth_request
e proxy_cache
autenticar solicitações para um microsserviço. Os usuários finais enviam um token simples Bearer
com 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 http
recurso 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-Token
como 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.