Comment utiliser nginx pour utiliser un proxy sur un hôte nécessitant une authentification?


41

Comment puis-je configurer une directive nginx proxy_pass incluant également les informations d'authentification HTTP Basic envoyées à l'hôte proxy?

Voici un exemple de l'URL pour laquelle je dois utiliser un proxy:

http://username:password@192.168.0.5/export?uuid=1234567890

L'objectif final est d'autoriser un serveur à présenter les fichiers d'un autre serveur (celui auquel nous faisons office de mandataire) sans exposer l'URI du serveur proxy. J'ai ce travail 90% correct maintenant de suivre la config Nginx trouvé ici:

http://kovyrin.net/2010/07/24/nginx-fu-x-accel-redirect-remote/

J'ai juste besoin d'ajouter l'authentification HTTP Basic pour envoyer au serveur proxy


@all: Assurez-vous que vous avez besoin de l'authentification HTTP Basic lorsque vous utilisez cette solution - et non de l'authentification HTTP Digest;) Vous avez eu beaucoup de difficulté à déboguer jusqu'à ce que je le découvre ... stackoverflow.com/questions/9534602/…
— SimonSimCity 20/06

Réponses:


57

J'ai rédigé un article à ce sujet il y a un moment. Voir les détails ici:

http://shairosenfeld.blogspot.com/2011/03/authorization-header-in-nginx-for.html

Par exemple:

 location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://6.6.6.6:80;
    proxy_set_header Authorization "Basic a2luZzppc25ha2Vk";
 }

"a2luZzppc25ha2Vk" est "roi: isnaked" codé en base64, donc cela fonctionnerait pour

http: // king: isnaked@6.6.6.6

N'hésitez pas à consulter le blog pour plus de détails.


2
Le lien est cassé
— Alex

1
Le lien est maintenant ici: shairosenfeld.blogspot.com/search?q=nginx au cas où quelqu'un se le demanderait
— ckm

1
J'ai besoin de quelque chose de plus difficile
— Ilja

7
Votre solution n'est pas assez flexible. Il pourrait être très utile d’encoder le nom d’utilisateur: mot de passe à la volée. Tout d'abord, nginx doit analyser le nom d'utilisateur: mot de passe de l'URL, ensuite, nginx doit coder ces données et les définir dans l'en-tête approprié. Je ne veux pas coder en dur les informations d'identification codées.
— Johnny

Je reçois une "mauvaise requête" en l'essayant sur ma configuration .. une idée?
— Spock

21

Cela fonctionnait avec la réponse d'alvosu mais je devais entrer le mot "Basic" dans la citation de la chaîne base64 pour qu'il ressemble à ceci:

proxy_set_header Authorization "Basic dGVzdHN0cmluZw==";

1
Savez-vous comment encoder nom d'utilisateur: mot de passe à la volée avec nginx? Les informations d'identification codées en dur ne sont pas flexibles, car je veux authentifier l'utilisateur avec les informations d'identification spécifiées par celui-ci dans l'URL.
— Johnny

1
J'ai trouvé comment encoder en base64 avec nginx wiki.nginx.org/HttpSetMiscModule#set_encode_base64 . Ceci est plus utile que les informations d'identification codées en dur.
— Johnny

Les liens @Johnny vers ces documents sont maintenant ici: github.com/openresty/set-misc-nginx-module#set_encode_base64
— Al Dass le


2

Supprimez l'en-tête d'autorisation transmis par nginx avec proxy_set_header Authorization "";.

J'ai configuré nginx pour qu'il effectue l'authentification de base, mais l'en- Authorizationtête était transmis dans la proxy_passdirective et le destinataire ne pouvait pas gérer le jeton.

# Basic Auth
auth_basic "Private Stuff";
auth_basic_user_file /etc/nginx/.htpasswd;

location /server {
    proxy_pass http://172.31.31.140:9090;
    proxy_set_header Authorization "";
}

(Spécifique à mon cas, cette erreur a été renvoyée Reason: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.