Single-Sign-On-Fluss mit JWT für die domänenübergreifende Authentifizierung
Gibt es eine Menge an Informationen auf dem Internet über die Verwendung von JWT (Json Web Token
) für die Authentifizierung. Aber ich wusste immer noch nicht finden, eine klare Erklärung, was die Strömung sollte bei der Verwendung von JWT Token für ein single-sign-on-Lösung in einer mehrfach-Domänen-Umgebung.
Ich arbeite für eine Firma die hat eine Menge von Websites, die auf verschiedenen hosts. Wir verwenden example1.com und example2.com. Wir brauchen ein single-sign-on-Lösung, was bedeutet, wenn ein Benutzer authentifiziert auf example1.comwir wollen ihn auch authentifiziert werden, auf example2.comautomatisch.
Mithilfe der OpenId Connect flow, ich verstehe, dass die Benutzer zu authentifizieren, die auf example1.com wird zunächst auf die umgeleitet werden Authentifizierungs-server (oder OP
: "OpenId Provider"). Der Benutzer authentifiziert sich am server, der dann leitet ihn zurück zu der ursprünglichen example1.com Website mit einer signierten JWT token. (Ich verstehe, es gibt eine andere Strömung, die gibt ein intermediate tokendass selbst ausgetauscht werden können, für die echte JWT token später auf, aber ich glaube nicht, dass dies erforderlich ist für uns)...
So, jetzt ist der user wieder auf example1.com und authentifiziert ist! Er kann Anträge stellen, vorbei an der JWT Tokens in einer Authentication
header und der server ist in der Lage zu überprüfen, die unterzeichnet JWT und ist daher in der Lage, den Benutzer zu identifizieren. Schön!
Erste Frage :
Wie soll der JWT Tokens werden auf dem client gespeichert? Es ist wieder eine Menge von Informationen über diese, und die Menschen scheinen zu vereinbaren, dass mit Web Storage
ist der Weg zu gehen, eher als der gute, alte cookies
. Wir wollen, dass der JWT hartnäckig zwischen browser neu gestartet, so lassen Sie uns Local Storage
nicht Session Storage
...
Nun kann der Benutzer seinen browser neu starten, und er wird immer noch authentifiziert werden example1.comsolange die JWT token nicht abgelaufen ist!
Auch, wenn example1.com muss ein Ajax-request zu einer anderen unserer domains, ich verstehe die Konfiguration CORS erlauben würde. Aber unsere wichtigste use case ist nicht cross-domain-requests, es ist mit einem single-sign-on-Lösung!
Daher die wichtigste Frage :
Nun, was sollte die Strömung sein, wenn der Benutzer geht zu example2.com und wir wollen, dass er authentifiziert werden, mit dem JWT token, den er bereits hat? Local Storage
scheint nicht, dass cross-domain-Zugriff, so dass an dieser Stelle der browser nicht Lesen können, die JWT token Anfragen stellen, um example2.com!
Sollte :
- Der Benutzer umgeleitet werden, um die Authentifizierungs-server wieder? Wenn der authentifizierte Benutzer für example1.comdie
Authentifizierungs-server unter Umständen ein cookie auf dem Benutzer, so dass diese neue Authentifizierung-Anforderung für example2.com verwenden könnte, die cookie zu sehen, dass der Benutzer bereits authentifiziert ist und sofort leitet ihn zurück zu
example2.com mit der gleichen JWT token? - Oder können die browser, auf example2.comden Zugriff auf die JWT token, ohne zu gehen, um die Authentifizierungs-server wieder? Ich sehe, gibt es cross-storage-Lösungenaber sind diese weit verbreitet? Sind Sie die vorgeschlagene Lösung um eine cross-domain-SSO-Umgebung?
Wollen wir nicht etwas Phantasie, wir würden uns freuen, mit das meist genutzte Lösung!
InformationsquelleAutor der Frage electrotype | 2015-11-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte der Benutzer umgeleitet werden, um den Authentifizierungs-server wieder und erhalten Sie ein neues token (JWT), eine, die ist speziell für example2.com. Dies ist, wie OpenID Connect und alle anderen cross-domain-federated SSO-Protokoll arbeitet.
InformationsquelleAutor der Antwort Hans Z.
Umleiten Benutzer zu den central authentication service, wenn der Benutzer nicht angemeldet ist zu verlangen, Anmeldeinformationen und eine neue Authentifizierungs-token ist ein gängiges Szenario, in Single-Sign-On-Systeme unter Verwendung bekannter Protokolle wie oauth2 oder OpenIdConnect
Jedoch, wenn dieses schema ist unter cross-Domänen der größte Nachteil ist, dass der Benutzer authentifiziert werden jedes mal, wenn er wechselt zu einer anderen Domäne aufgrund gleichen Ursprungs Politik: die session-token können nicht geteilt werden-Domänen, so dass die SSO zu behandeln, wird der Benutzer als nicht authentifiziert.
example2.com
kann keinen Zugriff auf Daten vonexample1.com
aber es ist eine Technik zum austauschen von Daten zwischen Domänen mithilfe von browser localStorage oder cookies und einen iframe verweist auf eine intermediate-domainsso.example.com
Zur Authentifizierung der Benutzer in
example1.com
leiten Sie ihn an den Authentifizierungs-server insso.example.com
Ausgabe a JWT nach der Authentifizierung und speichern im localStorage auf dieser domain. Nach diesem, umleiten Benutzer auf die Herkunft domain example1.comErstellen Sie einen iframe in
example2.com
Hinweis aufsso.example.com
. Den iframe in sso.example.com liest die JWT token und sendet eine Meldung an die übergeordnete SeiteDie übergeordnete Seite empfängt die Nachricht und ruft den angeschlossenen token weiter mit den SSO-flow
Ist es kein problem mit same-origin-policy, weil
sso.example.com
hat Zugriff auf die localStorage-und die Kommunikation zwischen iframe und parent-Seite ist zulässig, wenn Herkunft und Empfänger erkennen sich gegenseitig (siehe http://blog.teamtreehouse.com/cross-domain-messaging-with-postmessage)Zur Vereinfachung der Entwicklung, die wir veröffentlicht haben kürzlich eine cross domain SSO mit JWT in https://github.com/Aralink/ssojwt
Diese Methode ist perfekt kompatibel mit SSO fließt. Es ist nur ein Weg, um die Authentifizierung token, ohne Umleitungen und vermeiden Sie unnötige log-ins, wenn die domains sind verbundene
InformationsquelleAutor der Antwort pedrofb
Nicht sicher, ob dies beantwortet Sie die Frage, aber wenn Ihr Hauptziel ist single-sign-on, ich denke, eine einfache reverse-proxy würde Ihr problem lösen (zumindest die cross-domain-Lagerung).
So
example1.com
example2.com
wäre etwas geworden wie
example.com/example1
example.com/example2
(Und von einem user auf dieser Seite, dieser ist in der Regel sauberer)
Wenn das nicht eine option, müssen Sie möglicherweise so eingerichtet, dass, wenn ein Benutzer authentifiziert, wird in 1 domain, es verwendet AJAX/versteckte iframes zu erstellen, die eine Authentifizierung mit anderen domains (senden einer 1-mal-token über die url, wenn Sie müssen).
und wenn DAS nicht eine option, müssen Sie möglicherweise zu greifen, um Benutzername+pin, als Browser werden immer strenger über cross-domain Interaktion.
InformationsquelleAutor der Antwort Tezra