Как использовать 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 аутентификацию для отправки на прокси-сервер

bwizzy
источник
@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==";
bwizzy
источник
1
Знаете ли вы, как кодировать имя пользователя: пароль на лету с помощью nginx? Жестко закодированные учетные данные не являются гибкими, потому что я хочу аутентифицировать пользователя с учетными данными, указанными им в URL.
Джонни
1
Я нашел, как кодировать в base64 с помощью nginx wiki.nginx.org/HttpSetMiscModule#set_encode_base64 . Это более полезно, чем жестко закодированные учетные данные.
Джонни
@Джонни ссылки на эти документы теперь здесь: github.com/openresty/set-misc-nginx-module#set_encode_base64
Аль Дасс
5

Установите proxy_set_header Authorization "USER_AND_PASS", где USER_AND_PASS = base64 (пользователь: проход)

alvosu
источник
3
отсутствует ключевое слово Basic.
Ян-Филипп Герке
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)

sunapi386
источник