| Zusammenfassung | Discourse OpenID Connect ermöglicht die Nutzung eines OpenID Connect-Anbieters als Authentifizierungsanbieter für Discourse. | |
| Installationsanleitung | Dieses Plugin ist im Discourse-Kern enthalten. Eine separate Installation des Plugins ist nicht erforderlich. |
Funktionen
Das Plugin zielt darauf ab, eine minimale Implementierung der Spezifikation bereitzustellen. Insbesondere wird der „Authorization Code Flow“ unterstützt. Um zu beginnen, folgen Sie den Installationsanweisungen für das Plugin oder kontaktieren Sie Ihren Hosting-Anbieter.
Unser oauth2-basic-Plugin kann für die Verbindung mit einigen OpenID-Connect-Anbietern verwendet werden (OpenID Connect basiert auf OAuth2). Dieses Plugin erfordert jedoch deutlich weniger manuelle Konfiguration und kann das JWT-„ID Token“ nutzen, falls keine JSON-API verfügbar ist.
Die Konfiguration erfolgt automatisch mithilfe eines OpenID Connect Discovery Documents. Laut Spezifikation sollte dies unter <issuer domain>/.well-known/openid-configuration zu finden sein, aber Discourse unterstützt jeden Pfad, um nicht-konforme Implementierungen zu ermöglichen (z. B. Azure B2C). Das Discovery-Dokument wird für 10 Minuten zwischengespeichert, um die Leistung auf Seiten mit hohem Verkehrsaufkommen zu verbessern.
Enthält das Discovery-Dokument einen userinfo_endpoint-Parameter, verwendet das Plugin diesen zur Erfassung von Benutzermetadaten. Andernfalls extrahiert das Plugin die Metadaten aus dem vom Token-Endpunkt bereitgestellten id_token (ein JWT). Das Plugin überprüft nicht die Authentizität der JWT-Signatur, da dies die Komplexität erheblich erhöhen würde. Diese Entscheidung wird von der Spezifikation unterstützt:
Wird das ID-Token über eine direkte Kommunikation zwischen dem Client und dem Token-Endpunkt empfangen (was in diesem Flow der Fall ist), kann die TLS-Server-Validierung verwendet werden, um den Aussteller anstelle der Überprüfung der Tokensignatur zu validieren.
Für Identitätsanbieter, die eine autorisierungsfreie Autorisierung mit dem „Authorization Code Flow mit Proof Key for Code Exchange“ unterstützen, sollte PKCE aktiviert sein, und die Konfiguration client_secret kann weggelassen werden.
Konfiguration
Grundlegende Konfigurationsoptionen
-
openid_connect_enabled:OpenID Connect-Authentifizierung aktivieren -
openid_connect_discovery_document: URL des OpenID Connect Discovery-Dokuments. Normalerweise unterhttps://your.domain/.well-known/openid-configurationzu finden -
openid_connect_client_id: OpenID Connect Client-ID -
openid_connect_client_secret: OpenID Connect Client-Secret -
openid connect rp initiated logout: Den Benutzer nach dem Abmelden zumend_session_endpointumleiten. Muss von Ihrem Identitätsanbieter unterstützt und im Discovery-Dokument enthalten sein. -
openid connect rp initiated logout redirect: (optional) Diepost_logout_redirect_uri, die an den Abmelde-Endpunkt übergeben wird. Falls angegeben, muss sie beim Identitätsanbieter registriert sein. -
openid_connect_authorize_scope: Die Scopes, die an den Autorisierungs-Endpunkt gesendet werden. Dies muss ‘openid’ enthalten. -
openid_connect_use_pkce: Proof Key for Code Exchange (PKCE) für die OpenID Connect-Authentifizierung aktivieren. -
openid_connect_verbose_logging: Detaillierte OpenID-Connect-Authentifizierungsinformationen in/logsprotokollieren. Dies sollte im normalen Betrieb deaktiviert bleiben.
Erweiterte Konfigurationsoptionen
-
openid_connect_token_scope: Die Scopes, die beim Anfordern des Token-Endpunkts gesendet werden. Die offizielle Spezifikation verlangt dies nicht. -
openid_connect_error_redirects: Wenn dercallback error_reasonden ersten Parameter enthält, wird der Benutzer zur URL im zweiten Parameter umgeleitet. Wird für ungewöhnliche Implementierungen verwendet, die Fehler als Antwort auf Benutzereingaben senden (z. B. Azure B2C). -
openid_connect_allow_association_change: Benutzern erlauben, ihre Discourse-Konten vom OpenID Connect-Anbieter zu trennen und erneut zu verbinden.
-
openid_connect_groups_claim: Der Name des Claims in der OIDC-Antwort[1], der die Benutzergruppen als Array von Strings enthält. Leer lassen, um die Gruppensynchronisierung zu deaktivieren. Siehe Gruppensynchronisierung unten. -
openid_connect_user_field_mappings: Zuordnungen von OIDC-Claims[2], die in Discourse-Benutzerfeldern gespeichert werden. Benutzerfelder werden durch ihre numerische ID identifiziert, die in der URL beim Bearbeiten über das Admin-Panel zu finden ist.
Gruppensynchronisierung
Das Plugin kann Gruppennmitgliedschaften automatisch von Ihrem OpenID Connect-Anbieter zu Discourse-Gruppen synchronisieren. Bei jedem Login liest das Plugin den konfigurierten Claim aus dem OIDC-Token und aktualisiert die Gruppennmitgliedschaften des Benutzers entsprechend. Um die Gruppensynchronisierung zu aktivieren:
-
Konfigurieren Sie Ihren Identitätsanbieter so, dass er ein Array von Gruppen in einem der Claims zurückgibt. Dies muss ein Array von Strings sein.
-
Setzen Sie
openid_connect_groups_claimauf den Namen des Claims im OIDC-Token, der die Benutzergruppen enthält (z. B.cognito:groups). Sobald dies gesetzt ist, beginnt die Synchronisierung der Informationen mit dem „Associated Groups“-System von Discourse. -
Suchen Sie die Discourse-Gruppe, die Sie verknüpfen möchten. Gehen Sie zu „Einstellungen“ → „Mitgliedschaft“ → „Automatisch“ und wählen Sie dann die zu verknüpfenden Associated Groups aus. Diese Dropdown-Liste wird mit Informationen vom Identitätsanbieter gefüllt, sodass mindestens ein Gruppenmitglied eingeloggt sein muss, damit eine Option erscheint.
Beispielkonfiguration
Hier richten wir das OpenID-Connect-Plugin ein, um eine Verbindung zum OpenID-Connect-Anbieter von Google herzustellen. Dies repliziert Funktionen, die bereits im Kern von Discourse vorhanden sind, dient jedoch als zugängliches Beispiel.
-
Gehen Sie zu OpenID Connect | Sign in with Google | Google for Developers und folgen Sie den Anweisungen, um OAuth-Anmeldedaten zu erhalten.
-
Auf derselben Seite folgen Sie den Anweisungen, um eine Redirect-URI hinzuzufügen. Diese sollte
https://<your_forum>/auth/oidc/callbacklauten (ohne abschließenden Schrägstrich). -
Gehen Sie zu den Einstellungen Ihrer Discourse-Website und suchen Sie nach „openid_connect“.
-
openid connect enabled: [x] -
openid connect discovery document:https://accounts.google.com/.well-known/openid-configuration -
openid connect client id:<client-id> -
openid connect client secret:<client-secret> -
openid connect authorize scope:
openid email(mit einem Leerzeichen dazwischen)
-
-
Sie sind fertig. Der Button „Login with OpenID Connect“ meldet sich nun mit Google an
. Diese Schritte können mit minimalen Änderungen auch auf andere Anbieter angewendet werden.
Fehlerbehebung
Zusätzlich zur oben beschriebenen Einstellung verbose_logging können Sie mit dem Data-Explorer-Plugin Daten über OIDC-Assoziationen abrufen:
SELECT user_id, provider_name, provider_uid
FROM user_associated_accounts
WHERE provider_name = 'oidc'
Oder in der Rails-Konsole:
User.find_by_username("david").user_associated_accounts.where(provider_name: 'oidc')
Anbieter-spezifische Hinweise
Falls Sie anbieter-spezifische Eigenheiten im Zusammenhang mit dieser Integration entdecken, können Sie diese gerne aktualisieren:
Entra ID (ehemals Azure AD)
Fügen Sie den email-Scope hinzu und stellen Sie sicher, dass Sie das Konfigurationsdokument der Version 2 verwenden. Zum Beispiel:
https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration
Azure B2C
Die Details zur URL des Discovery-Dokuments finden Sie hier: Web sign in with OpenID Connect - Azure AD B2C | Microsoft Learn
Damit E-Mails funktionieren:
Yahoo
-
Gehen Sie zu https://developer.yahoo.com/apps und erstellen Sie eine neue App.
-
Geben Sie den Anwendungsnamen ein und setzen Sie die Callback-Domain auf Ihre Forum-Domain (z. B.
meta.discourse.org). -
Wählen Sie unter API-Berechtigungen Profiles: Read/Write Public and Private. Dies ist der einzige mir bekannte Weg, um die E-Mail-Adresse des Benutzers zu erhalten.
-
Speichern Sie die App.
-
Stellen Sie in den Discourse-OIDC-Einstellungen das Discovery-Dokument auf:
https://login.yahoo.com/.well-known/openid-configuration -
Geben Sie die Client-ID und das Secret von Yahoo ein.
-
Aktivieren Sie das OIDC-Plugin.
AWS Cognito
- Gehen Sie zu Cognito und wählen Sie einen neuen Benutzerpool aus oder erstellen Sie einen.
- Definieren Sie eine App unter App-Clients.
- Lassen Sie alles auf den Standardwerten, ändern Sie jedoch die Konfiguration der Auth-Flows, sodass nur ALLOW_REFRESH_TOKEN_AUTH ausgewählt ist.
- Gehen Sie zu den App-Client-Einstellungen und wählen Sie die neue App aus.
- Ändern Sie die Callback-URL zu https://yoursite.example.com/auth/oidc/callback.
- Aktivieren Sie nur den Authorization Code Grant Flow unter „Allowed OAuth Flows“.
- Aktivieren Sie alle benötigten Scopes (ich habe alle aktiviert).
Okta
-
Konfigurieren Sie Discourse mit Ihrer Okta-App-Client-ID und dem Secret.
-
Setzen Sie die URL des Discovery-Dokuments auf:
https://{your-app}.okta.com/.well-known/openid-configuration -
Setzen Sie in Discourse den
openid connect authorize scopeaufopenid email.
Von uns gehostet? Dieses Plugin ist in unseren Business- und Enterprise-Plänen verfügbar. OAuth 2.0 & OpenID Connect Support | Discourse - Civilized Discussion
Benötigen Sie eine Automatisierung der Benutzerregistrierung? Siehe Auto-provisioning user accounts when SSO is enabled
