Ich habe eine Websitehttp://blahblah.com Ich möchte eine Login-Seite hinzufügen, bevor irgendetwas vonhttp://blahblah.com. Ich habe einen einfachen Login-Code in PHP geschrieben. Das Problem ist, dass ich den Code in Blablah nicht ändern kann, es handelt sich um einen Microservice, der in Rust und anderen Sprachen geschrieben ist.
In login.php kann ich bei Bedarf zu blahblah.com weiterleiten. Ich weiß, dass ich haproxy zwingen kann, zu my-login.com weiterzuleiten, wenn Leute zu blahblah.com kommen, und dann könnte ich in my-login.com zu blahblah.com weiterleiten, aber das könnte im Kreis enden.
Kann mir jemand helfen/Tipps geben, wie die Haproxy-Konfiguration aussehen sollte, damit dies funktioniert?
Antwort1
HAProxy ist hierfür vielleicht nicht das beste Tool, aber das lässt sich schwer sagen, ohne Ihre Architektur und Nutzung besser zu verstehen. Eine Möglichkeit besteht jedenfalls darin, eine map
Funktion zu verwenden, um das richtige Backend auszuwählen.
Sehenhttps://www.haproxy.com/blog/einführung-in-haproxy-maps/, aber grob gesagt würde man so etwas machen wie
frontend frontend-blahblah
bind *:443
use_backend %[req.hdr(x-app-auth),map(/mnt/resource/token.map,backend-unauth)]
Die Map-Datei /mnt/resource/token.map
enthält eine Liste von Authentifizierungsschlüsseln, die jeweils dem backend-auth
Backend zugeordnet sind (z. B. blahblah.com). Jeder ohne Authentifizierungsschlüssel wird an backend-unauth
(z. B. Ihren Anmeldeserver) weitergeleitet.
Darüber hinaus müssen Sie Folgendes tun:
- In diesem Beispiel müsste die App den
X-App-Auth
Header bei jeder Anfrage senden. Oder ändern Sie ihn so, dass stattdessen Cookies verwendet werden, wiereq.cook(APPAUTH)
. - Wenn sich ein Benutzer an- oder abmeldet,
/mnt/resource/token.map
muss die Map-Datei von Ihrem Anmeldeserver aktualisiert werden. Im oben genannten Artikel finden Sie mehrere Möglichkeiten, dies zu tun. Am einfachsten ist es vielleicht, denhttp-request set-map
Zugriffhttp-request del-map
auf die IP Ihres Anmeldeservers zu beschränken, z. B. indem Sie HAProxy auf einem separaten „Verwaltungsport“ abhören lassen und Anfragen von anderen IPs sowie andere Sicherheitsmaßnahmen ablehnen. Beispielsweise könnte Ihr Anmeldeserver einen Anruf tätigen anhttps://blahblah.com:8443/add-token/123456789... um einen Authentifizierungsschlüssel hinzuzufügen. - Der Anmeldeserver muss sich um das Setzen des Cookies/die Rückgabe des Authentifizierungsschlüssels an den Client kümmern. Es gibt wahrscheinlich einige standortübergreifende Probleme, was bedeutet, dass möglicherweise einige Anpassungen am HAProxy-Header erforderlich sind. Möglicherweise haben Sie diese bereits berücksichtigt und gelöst.
All dies ist ein stumpfes Instrument - ein Benutzer ist angemeldet und hat die Berechtigung, auf die Site zuzugreifen oder nicht. Es gibt keine große Detailgenauigkeit bei der Unterscheidung der Benutzer. Wenn Sie dies wünschen, wäre es besser, Ihren Anmeldeserver als Proxy vor die andere Site zu stellen.