Как использовать 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 // король: isnaked@6.6.6.6

Не стесняйтесь проверить сообщение в блоге для более подробной информации.


2
Ссылка не работает
Alex

1
Ссылка теперь здесь: shairosenfeld.blogspot.com/search?q=nginx на случай, если кому-то интересно
ckm

1
Мне нужно что-то более сложное
Илья

7
Ваше решение недостаточно гибкое. Это может быть очень полезно для кодирования имени пользователя: пароль на лету. Во-первых, nginx должен проанализировать имя пользователя: пароль из URL, во-вторых, nginx должен закодировать эти данные и установить в соответствующем заголовке. Я не хочу жестко закодировать закодированные учетные данные.
Джонни

Я получаю "неверный запрос" при попытке установить его на моей установке ... Есть идеи?
Спок

21

Я получил это, работая с ответом alvosu, но мне пришлось ввести слово «Basic» внутри цитаты строки base64, чтобы она выглядела так:

proxy_set_header Authorization "Basic dGVzdHN0cmluZw==";

1
Знаете ли вы, как кодировать имя пользователя: пароль на лету с помощью nginx? Жестко закодированные учетные данные не являются гибкими, потому что я хочу аутентифицировать пользователя с учетными данными, указанными им в URL.
Джонни

1
Я нашел, как кодировать в base64 с помощью nginx wiki.nginx.org/HttpSetMiscModule#set_encode_base64 . Это более полезно, чем жестко закодированные учетные данные.
Джонни

@Джонни ссылки на эти документы теперь здесь: github.com/openresty/set-misc-nginx-module#set_encode_base64
Аль Дасс


2

Удалите заголовок авторизации, который передается с помощью nginx proxy_set_header Authorization "";.

Я настроил nginx для выполнения базовой аутентификации, но 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.