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:[email protected]/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

bwizzy
la source
@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: [email protected]

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

Shai
la source
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==";
bwizzy
la source
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
5

Définissez l'autorisation proxy_set_header "USER_AND_PASS", où USER_AND_PASS = base64 (utilisateur: pass)

Alvosu
la source
3
manque le mot clé Basic.
Jan-Philip Gehrcke 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)

sunapi386
la source