Möchten Sie Discourse als Identitätsanbieter für Ihre eigene Web-App verwenden? Großartig! Lassen Sie uns beginnen.
DiscourseConnect-Anbietereinstellung aktivieren
Aktivieren Sie unter den Website-Einstellungen der Discourse-Administration (/admin/site_settings) die Einstellung enable discourse connect provider und fügen Sie einen geheimen String zu discourse connect provider secrets hinzu (wird zum Hashen von SSO-Payloads verwendet).
Implementieren Sie DiscourseConnect in Ihrer Web-App:
-
Generieren Sie eine zufällige Nonce. Nennen wir diesen Wert
NONCE. Speichern Sie ihn vorübergehend, damit Sie ihn mit dem Wert der Nonce, der in der Antwort zurückgegeben wird, verifizieren können. -
Erstellen Sie eine neue Payload mit der
NONCEund einerRETURN_URL(zu der Discourse den Benutzer nach der Verifizierung weiterleitet). Die Payload sollte so aussehen:nonce=NONCE&return_sso_url=RETURN_URL. Der Host derRETURN_URLmuss mit dem Domain-Muster übereinstimmen, das Sie bei der Konfiguration vondiscourse connect provider secretsverwendet haben. -
Base64-codieren Sie die obige Roh-Payload. Nennen wir diese Payload
BASE64_PAYLOAD. -
URL-codieren Sie die obige
BASE64_PAYLOAD. Nennen wir diese PayloadURL_ENCODED_PAYLOAD. -
Generieren Sie eine HMAC-SHA256-Signatur aus der
BASE64_PAYLOADunter Verwendung Ihres SSO-Anbietergeheimnisses als Schlüssel, und erstellen Sie daraus anschließend einen Hex-String in Kleinbuchstaben. Nennen wir diese SignaturHEX_SIGNATURE.
Senden Sie eine Authentifizierungsanforderung an Discourse
Leiten Sie den Benutzer zu DISCOURSE_ROOT_URL/session/sso_provider?sso=URL_ENCODED_PAYLOAD&sig=HEX_SIGNATURE weiter.
Erhalten Sie die Antwort von Discourse:
Wenn die obigen Schritte korrekt ausgeführt wurden, leitet Discourse den angemeldeten Benutzer zur angegebenen RETURN_URL weiter. Sie erhalten Abfrageparameter mit sig und sso sowie einige Benutzerinformationen. Führen Sie nun die folgenden Schritte aus:
-
Berechnen Sie das HMAC-SHA256 von
ssounter Verwendung des SSO-Anbietergeheimnisses als Schlüssel. -
Wandeln Sie
sigvon seiner Hex-String-Darstellung zurück in Bytes um. -
Stellen Sie sicher, dass die beiden obigen Werte übereinstimmen.
-
Base64-dekodieren Sie
sso; Sie erhalten die übergebene eingebettete Abfragezeichenfolge. Diese enthält einen Schlüssel namensnonce, dessen Wert mit der ursprünglich übergebenen Nonce übereinstimmen sollte. Stellen Sie sicher, dass dies der Fall ist, und löschen Sie die Nonce unbedingt aus Ihrem System. -
Sie werden feststellen, dass diese Abfragezeichenfolge auch eine Reihe von Benutzerinformationen enthält. Verwenden Sie diese nach Belieben.
Das ist alles. Bis dahin sollten Sie Ihre Web-App so eingerichtet haben, dass sie Discourse als SSO-Anbieter verwendet!
Mehr Parameter, Mehr Optionen
Zusätzlich zu nonce und return_sso_url enthält die Anforderungs-Payload mehrere optionale zusätzliche Parameter.
-
prompt: Wennprompt=none, wird die SSO-Anforderung als „nur prüfen“-Anforderung behandelt. Wenn der Browser/das Gerät bereits bei Discourse angemeldet ist, gibt Discourse wie gewohnt eine erfolgreiche SSO-Antwort mit Benutzerauthentifizierungsinformationen zurück. Wenn der Browser/das Gerät nicht angemeldet ist, fragt Discourse den Benutzer nicht nach der Anmeldung und gibt stattdessen sofort eine SSO-Antwort mit dem Parameterfailed=trueanstelle von Benutzerinformationen zurück. Dies bietet einen Mechanismus, um abzufragen, ob der Benutzer angemeldet ist, ohne den Benutzer jemals zu einem Anmeldedialog weiterzuleiten, falls er nicht angemeldet ist. -
logout: Wennlogout=true, wird die SSO-Anforderung zu einer Abmeldeanforderung. Wenn ein Benutzer auf diesem Browser/Gerät bei Discourse angemeldet ist, wird er von diesem Gerät abgemeldet. In jedem Fall leitet Discourse sofort zurück zurreturn_sso_urlweiter, ohne dassssoodersigder Abfragezeichenfolge hinzugefügt werden. -
require_2fa: Wennrequire_2fa=true, verlangt Discourse vom Benutzer die Überprüfung der Zwei-Faktor-Authentifizierung, bevor er zurückgeleitet wird. Die Antwort-Payload enthältconfirmed_2fa=true, wenn der Benutzer die 2FA-Überprüfung erfolgreich abgeschlossen hat, oderno_2fa_methods=true, wenn der Benutzer keine 2FA-Methoden konfiguriert hat.
prompt=none und logout=true sind gegenseitig ausschließend; es ergibt keinen Sinn, beide in derselben Anforderung anzugeben.
sso= Payload-Referenz
Anforderungsparameter:
nonce: (String, erforderlich) eine sicher generierte zufällige Zeichenfolgereturn_sso_url: (String, erforderlich) die URL, zu der mit der Antwort zurückgeleitet werden sollprompt: (String, optional) Wennnone, wird der Authentifizierungsstatus ohne Aufforderung zur Anmeldung beim Benutzer abgefragt.logout: (Boolean, Standardfalse) Wenntrue, wird der Benutzer von Discourse abgemeldet.require_2fa: (Boolean, Standardfalse) Wenntrue, muss der Benutzer die Zwei-Faktor-Authentifizierung überprüfen, bevor er zurückgeleitet wird.
Ergebnisp-Parameter:
-
Es gibt keine
sso=-Payload oder Signatur als Antwort auf eine Abmeldeanforderung, nur eine Weiterleitung zur einfachenreturn_sso_urlder Anforderung. -
Die Ergebnis-Payload für eine Anmeldeanforderung enthält immer die
nonce, die von der Anforderung reflektiert wird. -
Die Ergebnis-Payload spiegelt auch alle anderen Anforderungsparameter wider. Verlassen Sie sich nicht auf dieses Verhalten; es ist nicht unbedingt beabsichtigt und kein garantierter Aspekt der API. (Warum wird beispielsweise der Parameter
return_sso_urlin die Payload kopiert, die an diereturn_sso_urlgesendet wird?) -
Wenn die Anforderung die Authentifizierung eines Benutzers fehlgeschlagen hat, enthält die Ergebnis-Payload
failed=true. -
Wenn die Anforderung die Authentifizierung eines Benutzers erfolgreich abgeschlossen hat, enthält die Ergebnis-Payload Anmelde-/Benutzerinformationen:
external_id: (String) Discourse Benutzer-IDusername: (String) Benutzername/Handlename: (String) Name des Benutzersemail: (String) E-Mail-Adresseavatar_url: (String) vollständige CDN-URL des hochgeladenen Avatarbilds des Benutzersadmin: (Boolean)true, wenn der Benutzer ein Administrator ist, andernfallsfalsemoderator: (Boolean)true, wenn der Benutzer ein Moderator ist, andernfallsfalsegroups: (String) durch Kommas getrennte Liste von Gruppen (nach Name), zu denen der Benutzer gehörtprofile_background_url: (String) vollständige CDN-URL des Profilhintergrundbilds des Benutzerscard_background_url: (String) vollständige CDN-URL des Kartenhintergrundbilds des Benutzersconfirmed_2fa: (Boolean)true, wenn der Benutzer die 2FA-Überprüfung abgeschlossen hat (nur vorhanden, wennrequire_2fa=trueangefordert wurde)no_2fa_methods: (Boolean)true, wenn der Benutzer keine 2FA-Methoden konfiguriert hat (nur vorhanden, wennrequire_2fa=trueangefordert wurde)
name,avatar_url,profile_background_urlundcard_background_urlkönnen fehlen, wenn der Benutzer diese nicht festgelegt hat. (Jedes Element mit einemnil-Wert innerhalb von Discourse wird aus der Antwort weggelassen.)
Offizielle „Verwendung von Discourse als Identitätsanbieter“-Implementierungen von Discourse:
- Ein HTTP-Proxy (mit Golang), der Discourse SSO zur Authentifizierung von Benutzern verwendet (nur Admins): GitHub - discourse/discourse-auth-proxy: An http proxy that uses the DiscourseConnect protocol to authenticate users · GitHub (erstellt von @sam)
Von der Community beigesteuerte Implementierungen zur „Verwendung von Discourse als SSO-Anbieter“:
-
Ein PHP-Skript, das Discourse als SSO-Anbieter implementiert: Discourse sso provider login · GitHub (erstellt von @paxmanchris)
-
Erlang:
https://github.com/reverendpaco/discourse-as-sso-erlang -
Node.js:
GitHub - edhemphill/passport-discourse: A Passport strategy for authenticating using a Discourse forum · GitHub
GitHub - ArmedGuy/discourse_sso_node: npm package for Discourse SSO login features. · GitHub -
ASP.NET Core (erfordert nur Konfiguration):
GitHub - Biarity/DiscourseSso: Easy, configurable Discourse SSO: GET /auth/login -> recieve a JWT with user data · GitHub -
MediaWiki-Erweiterung (PHP):
DiscourseSsoConsumer, a SSO extension for MediaWiki (erstellt von @mdoggydog)
