Eu tenho um cliente 1.), um servidor proxy nginx 2.) e 3.) alguns servidores cujos endereços são inacessíveis para o cliente, o proxy lida com a comunicação do cliente para esses servidores.
Funcionou bem até agora. Mas agora alguns desses servidores exigem autenticação por resumo HTTP em vez de autenticação básica HTTP e o cliente não consegue mais autenticar nesses servidores corretamente.
Graças ao wget e ao Wireshark, pude encurralar o problema um pouco.
O cabeçalho HTTP de uma autenticação em funcionamento é assim:
GET /targetpath/myfile.jpg HTTP/1.1
User-Agent: Wget/1.15 (linux-gnu)
Accept: */*
Host: 192.168.5.215
Connection: Keep-Alive
Authorization: Digest username="myuser", realm="MyRealm", nonce="x+AfVa0pBQA=ad6ef47eb7e95f9fe8e148a9ccd22dcdb3b8a7f6", uri="/targetpath/myfile.jpg", response="6f7cf06ddededd7295ce3a16b4196528", qop=auth, nc=00000001, cnonce="26310a3e", algorithm="MD5"
O cabeçalho da autenticação que não funciona, feito pelo proxy, parece um pouco diferente:
GET /targetpath/myfile.jpg HTTP/1.0
Connection: Keep-Alive
Host: 192.168.5.215
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0
Referer: http://localhost/
Authorization: Digest username="MyUser", realm="MyRealm", nonce="Sh3xpq0pBQA=ccc43b898eccd1933fa63383d8a6447385119db9", uri="/proxypath/192.168.5.215/targetpath/myfile.jpg", algorithm=MD5, response="068f00e3460e4b585b4a90fa76be8b27", qop=auth, nc=00000003, cnonce="cbe75557a6107092"
Por favor, note a diferença no uri dentro do cabeçalho de Autorização. Este é, obviamente, o caminho de solicitação do servidor proxy. (Como o cliente lida com a autenticação, o proxy apenas transmite dados e reescreve o URL) Eu suspeito que é de onde vem o problema. (Por favor, note que não consigo depurar diretamente nos servidores de destino para verificar isso)
Portanto, a pergunta é: existe uma maneira de reescrever a autorização dinamicamente antes que ela seja passada para o servidor de destino? Existe uma maneira de deixar o servidor proxy lidar com a autenticação, em vez de simplesmente passá-lo do cliente? Ou existe outra abordagem melhor?