У меня есть веб-сайтhttp://blahblah.com Я хочу добавить страницу входа в систему прежде всегоhttp://blahblah.com. Я написал простой код входа на php. Проблема в том, что я не могу изменить код в blahblah, это какой-то микросервис, написанный на Rust и других языках.
В login.php я могу перенаправить на blahblah.com по мере необходимости. Я знаю, что могу заставить haproxy перенаправлять на my-login.com, если люди заходят на blahblah.com, а затем в my-login.com я могу перенаправить на blahblah.com, но это может закончиться циклами.
Может ли кто-нибудь помочь/дать мне советы о том, какой должна быть конфигурация haproxy, чтобы это работало?
решение1
HAProxy может быть не лучшим инструментом для этого, но трудно сказать, не понимая вашу архитектуру и использование лучше. В любом случае, один из способов — использовать функцию map
для выбора правильного бэкэнда.
Видетьhttps://www.haproxy.com/blog/introduction-to-haproxy-maps/, но примерно вы бы сделали что-то вроде
frontend frontend-blahblah
bind *:443
use_backend %[req.hdr(x-app-auth),map(/mnt/resource/token.map,backend-unauth)]
Файл карты /mnt/resource/token.map
будет иметь список ключей аутентификации, каждый из которых сопоставляется с backend-auth
бэкэндом (т. е. blahblah.com). Любой, у кого нет ключа аутентификации, отправляется на backend-unauth
(т. е. на ваш сервер входа).
Вам дополнительно необходимо будет сделать следующее:
- В этом примере приложению пришлось бы отправлять
X-App-Auth
заголовок с каждым запросом. Или изменить его, чтобы вместо этого использовать файлы cookie, напримерreq.cook(APPAUTH)
. - Когда пользователь входит или выходит из системы, файл карты
/mnt/resource/token.map
должен быть обновлен вашим сервером входа. См. статью, указанную выше, для нескольких способов сделать это. Возможно, самый простой — использоватьhttp-request set-map
иhttp-request del-map
и ограничить доступ к IP вашего сервера входа, например, заставить HAProxy прослушивать отдельный «порт управления» и отклонять запросы с других IP, а также любую другую безопасность. Например, ваш сервер входа может сделать вызовhttps://blahblah.com:8443/add-token/123456789... чтобы добавить ключ аутентификации. - Серверу входа необходимо будет позаботиться об установке cookie/возврате ключа аутентификации клиенту. Вероятно, есть некоторые проблемы с кросс-сайтами, что означает необходимость корректировки заголовка HAProxy; вы, возможно, уже рассмотрели и решили их.
Все это грубый инструмент — пользователь вошел в систему и имеет разрешение на доступ к сайту или нет. Нет особой детализации, разделяющей пользователей; если вы этого хотите, вам лучше разместить свой сервер входа перед другим сайтом в качестве прокси.