Ich habe eine App entwickelt, die die Discourse-API und SSO als Anbieter nutzt.
Derzeit wird die App in einem Iframe eingebettet. Damit die Social-Login-Funktion ordnungsgemäß funktioniert, muss die Seite /login außerhalb des Iframes in einem neuen Browser-Tab geöffnet werden.
Bis hierher also alles in Ordnung.
Problem
Wenn sich ein neuer Benutzer über einen Social-Login-Button registriert, wird er zwar korrekt zur Social-Site weitergeleitet. Doch sobald er zurück zu Discourse gelangt, tritt das Problem auf: Discourse zeigt das Anmelde-Modal an, anstatt das Modal mit bereits ausgefülltem Benutzernamen/E-Mail.
Um dieses Modal zu sehen und die Registrierung abzuschließen, muss man das Anmelde-Modal schließen und dann manuell auf den Registrierungs-Button klicken.
Nur bei neuen Benutzern funktioniert die Anmeldung wie erwartet.
Habe ich etwas übersehen, oder gibt es einen Kontext, den Discourse nicht korrekt behandelt? Technisch gesehen sollte es gleich ablaufen.
Wenn du eine Demo sehen möchtest, lass es mich bitte wissen. Ich kann dir per PN ein kurzes Video senden (es enthält private Informationen).
Genauer gesagt wird die App in einer Chrome-Erweiterung verwendet. Wir nutzen ein iframe, da wir derzeit keine andere Wahl haben. Trotzdem bin ich mir nicht sicher, worin der Unterschied besteht, wenn man programmatisch über ein iframe einen neuen Tab im Browser zu /login oder /signup öffnet, im Vergleich dazu, manuell einen Tab zu öffnen und auf den Login-/Signup-Button zu klicken.
Lässt sich das in Discourse beheben?
Derzeit nutzen wir Discourse als SSO-Anbieter. Gibt es andere Möglichkeiten?
Wenn ja, was wäre der beste Weg, um Login/Signup in diesem Kontext umzusetzen?
Wie haben Sie das umgesetzt? Es klingt so, als würden irgendwo Cookies oder Sitzungsdaten verloren gehen.
Generell unterstützen wir die Nutzung von Discourse in einem Iframe nicht. Wie Sie bereits festgestellt haben, gibt es seltsame Eigenheiten, die zu Problemen führen können.
Ich binde Discourse nicht in einem iframe ein. Ich verwende die API, um Nachrichten aus Themen anzuzeigen.
Ich versuche nicht, mich innerhalb eines iframes anzumelden oder ein Konto zu erstellen, da soziale Websites nicht erlauben, in iframes angezeigt zu werden. Deshalb öffnet sich beim Klicken auf einen Button innerhalb des iframes ein neuer Browser-Tab zur /login-Seite von Discourse.
Technisch gesehen wird beim Klicken auf den Anmelde-Button ein neuer Tab mit /session/sso_provider geöffnet. return_sso_url enthält eine URL zum Backend, um die Daten zu verarbeiten, die Sitzungsdaten des Benutzers zu speichern und dann eine HTML-Antwort zu senden, die das Schließen des Fensters automatisch auslöst. Die App erkennt dann, dass dies abgeschlossen ist, und wird automatisch neu geladen, damit sie die gespeicherten Sitzungsdaten des Benutzers nutzen kann.
Selbst wenn die App nicht in einem iframe wäre, würde dies wahrscheinlich genauso passieren. Da es sich um eine Browsererweiterung handelt, müssen Sie ohnehin einen neuen Tab öffnen. Ich frage mich, ob es in diesem Fall bessere Möglichkeiten gibt, sich anzumelden oder ein Konto zu erstellen.
EDIT: Hier eine Demo (war nicht für die Öffentlichkeit gedacht, aber das ist der kürzeste Weg, das Problem zu zeigen, und ich habe das Gefühl, ich habe es nicht gut genug erklärt): ausgelassen, Video entfernt, interessiert ohnehin niemanden
EDIT2: Das scheint nur aufzutreten, wenn die API /session/sso_provider verwendet wird; wenn ich die Discourse-URL direkt öffne (immer noch aus einem iframe), scheint das Problem nicht aufzutreten.