Discourse OpenID Connect (OIDC)

:discourse2: Riepilogo Discourse OpenID Connect consente di utilizzare un provider OpenID Connect come provider di autenticazione per Discourse.
:open_book: Guida all’installazione Questo plugin è incluso nel core di Discourse. Non è necessario installarlo separatamente.

Funzionalità

Il plugin mira a fornire un’implementazione minimale di la specifica. Nello specifico, supporta il “Flusso del codice di autorizzazione”. Per iniziare, segui le istruzioni per l’installazione del plugin o contatta il tuo provider di hosting.

Il nostro plugin oauth2-basic può essere utilizzato per connettersi ad alcuni provider openid-connect (OpenID Connect si basa su OAuth2). Tuttavia, questo plugin richiede molta meno configurazione manuale e può utilizzare il “ID Token” JWT se un’API JSON non è disponibile.

La configurazione viene eseguita automaticamente utilizzando un Documento di scoperta OpenID Connect. Secondo la specifica, questo dovrebbe trovarsi in <dominio_emittente>/.well-known/openid-configuration, ma Discourse supporta qualsiasi percorso per consentire implementazioni non conformi (ad esempio Azure B2C). Il documento di scoperta viene memorizzato nella cache per 10 minuti, per migliorare le prestazioni sui siti ad alto traffico.

Se il documento di scoperta include un parametro userinfo_endpoint, il plugin lo utilizzerà per raccogliere i metadati dell’utente. In caso contrario, il plugin estrarrà i metadati dal id_token (un JWT) fornito dall’endpoint del token. Il plugin NON verifica l’autenticità della firma JWT, poiché ciò aumenterebbe significativamente la complessità. Questa decisione è supportata da la specifica:

Se il ID Token viene ricevuto tramite comunicazione diretta tra il Client e l’Endpoint del Token (come avviene in questo flusso), la convalida del server TLS PUÒ essere utilizzata per convalidare l’emittente al posto della verifica della firma del token.

Per i provider di identità che supportano l’autorizzazione senza segreto utilizzando il “Flusso del codice di autorizzazione con chiave di prova per lo scambio di codici”, PKCE dovrebbe essere abilitato e la configurazione client_secret può essere omessa.

Configurazione

Opzioni di configurazione di base

  • openid_connect_enabled: Abilita l’autenticazione OpenID Connect

  • openid_connect_discovery_document: URL del documento di scoperta OpenID Connect. Normalmente situato in https://tuo.dominio/.well-known/openid-configuration

  • openid_connect_client_id: ID client OpenID Connect

  • openid_connect_client_secret: Segreto client OpenID Connect

  • openid connect rp initiated logout: Reindirizza l’utente all’endpoint end_session_endpoint dopo il logout. Deve essere supportato dal tuo provider di identità e incluso nel documento di scoperta.

  • openid connect rp initiated logout redirect: (opzionale) Il post_logout_redirect_uri che verrà passato all’endpoint di logout. Se fornito, deve essere registrato presso il provider di identità.

  • openid_connect_authorize_scope: Gli ambiti (scopes) inviati all’endpoint di autorizzazione. Questo deve includere ‘openid’

  • openid_connect_use_pkce: Abilita la Chiave di Prova per lo Scambio di Codici (PKCE) per l’autenticazione OpenID Connect.

  • openid_connect_verbose_logging: Registra informazioni dettagliate sull’autenticazione openid-connect in /logs. Tieni questa opzione disabilitata durante l’uso normale.

Opzioni di configurazione avanzate

  • openid_connect_token_scope: Gli ambiti inviati quando si richiede l’endpoint del token. La specifica ufficiale non lo richiede.

  • openid_connect_error_redirects: Se il motivo dell’errore della callback contiene il primo parametro, l’utente verrà reindirizzato all’URL nel secondo parametro. Utilizzato per implementazioni insolite che inviano errori in risposta all’input dell’utente (ad esempio Azure B2C)

  • openid_connect_allow_association_change: Consenti agli utenti di disconnettere e riconnettere i propri account Discourse dal provider OpenID Connect

  • openid_connect_groups_claim: Il nome della clausola (claim) nella risposta OIDC[1] che contiene i gruppi dell’utente come un array di stringhe. Lascia vuoto per disabilitare la sincronizzazione dei gruppi. Vedi Sincronizzazione dei gruppi di seguito.

  • openid_connect_user_field_mappings: Mappature delle clausole OIDC[2] che verranno memorizzate nei Campi Utente di Discourse. I campi utente sono identificati dal loro ID numerico, che può essere trovato nell’URL quando li modifichi tramite il pannello di amministrazione.

Sincronizzazione dei gruppi

Il plugin può sincronizzare automaticamente le appartenenze ai gruppi dal tuo provider OpenID Connect ai gruppi di Discourse. Ad ogni accesso, il plugin leggerà la clausola configurata dal token OIDC e aggiornerà di conseguenza le appartenenze ai gruppi dell’utente. Per abilitare la sincronizzazione dei gruppi:

  1. Configura il tuo provider di identità per restituire un array di gruppi in una delle clausole. Questo deve essere un array di stringhe.

  2. Imposta openid_connect_groups_claim sul nome della clausola nel token OIDC che contiene i gruppi dell’utente (ad esempio cognito:groups). Una volta impostato, inizierà a sincronizzare le informazioni con il sistema “Gruppi Associati” di Discourse.

  3. Trova il Gruppo Discourse che desideri collegare. Vai su “Impostazioni” → “Membri” → “Automatico” e scegli i Gruppi Associati da collegare. Questo elenco a discesa viene popolato con le informazioni dal provider di identità, quindi almeno un membro del gruppo deve aver effettuato l’accesso affinché appaia un’opzione.

Esempio di configurazione

Qui configureremo il plugin openid-connect per connettersi al provider OpenID Connect di Google. Questo replica una funzionalità già esistente nel core di Discourse, ma funge da esempio accessibile.

  1. Vai su OpenID Connect  |  Sign in with Google  |  Google for Developers e segui le istruzioni per ottenere le credenziali OAuth.

  2. Nella stessa pagina, segui le istruzioni per aggiungere un URI di reindirizzamento. Questo dovrebbe essere https://<tuo_forum>/auth/oidc/callback (senza una barra finale)

  3. Vai alle impostazioni del tuo sito Discourse e cerca “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 (con uno spazio in mezzo)

  4. Fatto. Il pulsante “Accedi con OpenID Connect” ora effettuerà l’accesso utilizzando Google :tada:. Questi stessi passaggi possono essere applicati ad altri provider con modifiche minime.

Debugging

Oltre all’impostazione verbose_logging descritta sopra, puoi accedere ai dati sulle associazioni OIDC utilizzando il plugin data-explorer:

SELECT user_id, provider_name, provider_uid
FROM user_associated_accounts
WHERE provider_name = 'oidc'

O sulla console rails:

User.find_by_username("david").user_associated_accounts.where(provider_name: 'oidc')

Note specifiche per provider

Sentiti libero di aggiornare questa sezione se trovi stranezze specifiche di un provider relative a questa integrazione:

Entra ID (precedentemente Azure AD)

Aggiungi l’ambito email e assicurati di utilizzare il documento di configurazione dell’endpoint versione 2. Ad esempio

https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration
Azure B2C

I dettagli dell’URL del documento di scoperta si trovano qui: Web sign in with OpenID Connect - Azure AD B2C | Microsoft Learn

Per far funzionare le email:

Yahoo
  1. Vai su https://developer.yahoo.com/apps e crea una nuova app

  2. Inserisci il nome dell’applicazione e imposta il dominio di callback sul dominio del tuo forum (ad esempio meta.discourse.org)

  3. Sotto Autorizzazioni API, scegli Profili: Lettura/Scrittura Pubblica e Privata. Questo è l’unico modo che conosco per ottenere l’indirizzo email dell’utente

  4. Salva l’app

  5. Nelle impostazioni OIDC di Discourse, imposta il documento di scoperta su

    https://login.yahoo.com/.well-known/openid-configuration
    
  6. Inserisci l’ID client e il segreto da Yahoo

  7. Abilita il plugin OIDC

AWS Cognito
  1. Vai su Cognito e seleziona o crea un nuovo pool di utenti.
  2. Definisci un’app in Client app.
  3. Lascia tutto ai valori predefiniti, ma modifica la configurazione dei Flussi di Autenticazione per selezionare solo ALLOW_REFRESH_TOKEN_AUTH.
  4. Vai alle impostazioni del client app e seleziona la nuova app.
  5. Modifica l’URL di callback in https://tuosito.example.com/auth/oidc/callback.
  6. Seleziona solo il flusso di concessione del codice di autorizzazione tra “Flussi OAuth consentiti”.
  7. Seleziona tutti gli ambiti necessari (io li ho tutti selezionati).
Okta
  1. Configura Discourse con l’ID client e il segreto della tua app Okta

  2. Imposta l’URL del documento di scoperta su

    https://{tua-app}.okta.com/.well-known/openid-configuration
    
  3. In Discourse, imposta openid connect authorize scope su openid email

:discourse2: Ospitato da noi? Questo plugin è disponibile nei nostri piani Business e Enterprise. OAuth 2.0 & OpenID Connect Support | Discourse - Civilized Discussion

:spiral_notepad: Devi automatizzare le registrazioni degli utenti? Vedi Auto-provisioning user accounts when SSO is enabled


  1. token o payload userinfo ↩︎

  2. dal token o dal payload userinfo ↩︎

52 Mi Piace
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