Discourse OpenID Connect (OIDC)

:discourse2: Zusammenfassung Discourse OpenID Connect ermöglicht die Nutzung eines OpenID Connect-Anbieters als Authentifizierungsanbieter für Discourse.
:open_book: 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 unter https://your.domain/.well-known/openid-configuration zu 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 zum end_session_endpoint umleiten. Muss von Ihrem Identitätsanbieter unterstützt und im Discovery-Dokument enthalten sein.

  • openid connect rp initiated logout redirect: (optional) Die post_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 /logs protokollieren. 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 der callback error_reason den 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:

  1. 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.

  2. Setzen Sie openid_connect_groups_claim auf 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.

  3. 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.

  1. Gehen Sie zu OpenID Connect  |  Sign in with Google  |  Google for Developers und folgen Sie den Anweisungen, um OAuth-Anmeldedaten zu erhalten.

  2. Auf derselben Seite folgen Sie den Anweisungen, um eine Redirect-URI hinzuzufügen. Diese sollte https://<your_forum>/auth/oidc/callback lauten (ohne abschließenden Schrägstrich).

  3. 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)

  4. Sie sind fertig. Der Button „Login with OpenID Connect“ meldet sich nun mit Google an :tada:. 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
  1. Gehen Sie zu https://developer.yahoo.com/apps und erstellen Sie eine neue App.

  2. Geben Sie den Anwendungsnamen ein und setzen Sie die Callback-Domain auf Ihre Forum-Domain (z. B. meta.discourse.org).

  3. 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.

  4. Speichern Sie die App.

  5. Stellen Sie in den Discourse-OIDC-Einstellungen das Discovery-Dokument auf:

    https://login.yahoo.com/.well-known/openid-configuration
    
  6. Geben Sie die Client-ID und das Secret von Yahoo ein.

  7. Aktivieren Sie das OIDC-Plugin.

AWS Cognito
  1. Gehen Sie zu Cognito und wählen Sie einen neuen Benutzerpool aus oder erstellen Sie einen.
  2. Definieren Sie eine App unter App-Clients.
  3. Lassen Sie alles auf den Standardwerten, ändern Sie jedoch die Konfiguration der Auth-Flows, sodass nur ALLOW_REFRESH_TOKEN_AUTH ausgewählt ist.
  4. Gehen Sie zu den App-Client-Einstellungen und wählen Sie die neue App aus.
  5. Ändern Sie die Callback-URL zu https://yoursite.example.com/auth/oidc/callback.
  6. Aktivieren Sie nur den Authorization Code Grant Flow unter „Allowed OAuth Flows“.
  7. Aktivieren Sie alle benötigten Scopes (ich habe alle aktiviert).
Okta
  1. Konfigurieren Sie Discourse mit Ihrer Okta-App-Client-ID und dem Secret.

  2. Setzen Sie die URL des Discovery-Dokuments auf:

    https://{your-app}.okta.com/.well-known/openid-configuration
    
  3. Setzen Sie in Discourse den openid connect authorize scope auf openid email.

:discourse2: Von uns gehostet? Dieses Plugin ist in unseren Business- und Enterprise-Plänen verfügbar. OAuth 2.0 & OpenID Connect Support | Discourse - Civilized Discussion

:spiral_notepad: Benötigen Sie eine Automatisierung der Benutzerregistrierung? Siehe Auto-provisioning user accounts when SSO is enabled


  1. Token oder Userinfo-Payload ↩︎

  2. aus Token oder Userinfo-Payload ↩︎

52 „Gefällt mir“
Native SSO with Azure AD
How to setup okta authentication with discourse
Discourse Login using external API
OpenIdAuthenticator plugin fails
Sign in to Discourse using ORCID
Discourse, Keycloak, SAML vs OAuth
OpenID Connect support in selfhosted Discourse instance
How can you connect firebase to discourse?
Keycloak SSO and logout issue
Tutorial for OpenID Connect / Azure AD
OpenID connect plugin
Azure OpenID Connect Authentication Plugin
Installing own gem in plugin
SSO Login page not showing up
Enabling Okta for employees only through OpenID Connect Authentication Plugin
Is "partial" SSO possible?
Auto-sign-in with the OpenId Connect Plugin and AWS Cognito
Official support for Microsoft Azure AD?
CodeBerg support
Availability of OpenID Connect in hosted plans
Can we use the default atlassian id to login to discourse
OpenIdAuthenticator plugin fails
Intergrate Discourse with keycloak
IndieAuth login
Intergrate Discourse with keycloak
Map oidc fields to custom user fields
CSRF problem in development with 'Discourse OpenID Connect' plug-in
Azure B2C SSO to Discourse?
User (patron) getting authorization error message
Memberstack + Webflow + Discourse OpenID Connect
How can add 2 or more discovery documents?
Memberstack + Webflow + Discourse OpenID Connect
Azure AD Authentication and Creation of User Account
Possible to create a Sign in with Ghost plugin for Discourse?
Custom Login Flow: AWS Cognito SSO (via Passwordless Signin) - Is this possible?
Account already in discourse
AAD integration with Discourse
Having trouble setting up AWS Cognito passwordless login
Discourse ID fails to activate on my instance
Restrict Office 365 Login to certain Group
OpenID Connect Plugin not creating new users with AWS Cognito
OIDC users not associating with existing Discourse users
Bundling more popular plugins with Discourse core
OpenID Connect Plugin Refactor (OIDC Implicit Flow)
Availability of OpenID Connect in hosted plans
How to configure the OIDC to set the Username as the email account name or a username like value returned from my auth providers?
Managing group membership via authentication
Failed to bootstrap due to out of memory killer
OAuth connection of discourse
Auto-provisioning user accounts when SSO is enabled
Anyone have a working AWS Cognito configuration w/ ouath2, openid or sso?
SAML Plugin on Self Hosted Discourse
Can I include website analytics in trust data?
Using OpenID Connect with User Flows in Azure B2C
ADFS Authentication
How to set-up Discourse with Atricore Josso CE
Error of Discourse OpenID Connect
How can add 2 or more discovery documents?
./launcher rebuild app fails hard 'bundle exec rake db:migrate' possible issue with github/master repo removal of auth/oath2_authenticator
Removing Yahoo login from Core, and deprecating OpenID 2.0
SSO with TownNews CMS
OpenID Connect Plugin Refactor (OIDC Implicit Flow)
OpenID with line.biz - email in JWT , missing in userinfo