Як використовувати nginx для проксі до хоста, який вимагає автентифікації?


41

Як я можу налаштувати директиву nginx proxy_pass, яка також міститиме інформацію про автентифікацію HTTP Basic, що надсилається хосту проксі?

Це приклад URL-адреси, яку мені потрібно проксі:

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

Кінцева мета - дозволити одному серверу представити файли з іншого сервера (того, до якого ми звертаємось), не піддаючи URI проксі-сервера. У мене це працює на 90% правильно з наступного конфігурації Nginx, знайденого тут:

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

Мені просто потрібно додати автентифікацію HTTP Basic для надсилання на проксі-сервер


@all: Переконайтеся , що вам потрібно HTTP Basic аутентифікації при використанні цього рішення - не HTTP Digest Authentication;) було досить важкий час налагодження навколо , поки я не зрозумів його ... stackoverflow.com/questions/9534602 / ...
SimonSimCity

Відповіді:


57

Я зробив перепис на це деякий час тому. Деталі дивіться тут:

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

Наприклад:

 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" є "king: isnaked" base64 закодовано, так що це буде працювати для

http: // king: isnaked@6.6.6.6

Не соромтеся ознайомитися з публікацією в блозі для отримання більш детальної інформації.


2
Посилання розірвано
Алекс

1
Посилання зараз тут: shairosenfeld.blogspot.com/search?q=nginx на випадок, коли хтось цікавиться
ckm

1
Мені потрібно щось складніше
Ілья,

7
Ваше рішення недостатньо гнучко. Це може бути дуже корисно кодувати ім'я користувача: пароль на льоту. По-перше, nginx повинен проаналізувати ім'я користувача: пароль з URL-адреси, по-друге, nginx повинен кодувати ці дані та встановити у відповідному заголовку. Я не хочу жорстко кодувати облікові дані.
Джонні

Я отримую "поганий запит" при спробі його на моїй установці .. будь-яка ідея?
Спок

21

Я отримав це, працюючи з відповіддю alvosu, але мені довелося ввести слово "Basic" всередині лапки string 64, щоб воно виглядало так:

proxy_set_header Authorization "Basic dGVzdHN0cmluZw==";

1
Чи знаєте ви, як кодувати ім'я користувача: пароль на льоту за допомогою nginx? Твердо кодові дані не є гнучкими, тому що я хочу автентифікувати користувача за допомогою даних, визначених ним у URL-адресі.
Джонні

1
Я знайшов, як кодувати до base64 за допомогою nginx wiki.nginx.org/HttpSetMiscModule#set_encode_base64 . Це корисніше, ніж тверді коди даних.
Джонні

@Johnny посилання на ці документи тепер тут: github.com/openresty/set-misc-nginx-module#set_encode_base64
Al


2

Видаліть заголовок авторизації, який передається nginx за допомогою proxy_set_header Authorization "";.

Я налаштував nginx робити базовий auth, але Authorizationзаголовок передається в proxy_passдирективі, і приймальний кінець не міг обробити маркер.

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

(Спеціально для мого випадку ця помилка була повернута Reason: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.