Configura DiscourseConnect - il Single-Sign-On ufficiale per Discourse (sso)

DiscourseConnect è una funzionalità fondamentale di Discourse che ti consente di configurare l’“Autenticazione Singola (SSO)” per delegare completamente a un altro sito la registrazione e l’accesso degli utenti, rimuovendo queste operazioni da Discourse. Disponibile per i nostri clienti con hosting Pro, Business e Enterprise.

:information_source: (Febbraio 2021) ‘Discourse SSO’ è ora ‘DiscourseConnect’. Se stai utilizzando una versione vecchia di Discourse, le impostazioni sotto saranno nominate sso_... invece di discourse_connect_...

Il problema

Molti siti che desiderano integrarsi con un sito Discourse vogliono mantenere tutta la registrazione degli utenti su un sito separato. In una configurazione del genere, tutte le operazioni di accesso devono essere delegate a quel diverso sito.

Cosa succede se desidero l’SSO insieme all’autenticazione esistente?

L’intenzione di DiscourseConnect è sostituire l’autenticazione di Discourse. Se desideri aggiungere un nuovo provider, consulta i plugin esistenti come: Discourse VK Authentication (vkontakte)

Abilitare DiscourseConnect

Per abilitare DiscourseConnect devi compilare tre impostazioni:

enable_discourse_connect: deve essere abilitato, interruttore globale
discourse_connect_url: l’URL esterno a cui gli utenti verranno reindirizzati quando tenteranno di accedere
discourse_connect_secret: una stringa segreta utilizzata per hashare i payload SSO. Garantisce che i payload siano autentici.

Una volta impostato enable_discourse_connect su true:

  • Cliccando su accesso o avatar verrai reindirizzato a /session/sso, che a sua volta reindirizzerà gli utenti a discourse_connect_url con un payload firmato.
  • Gli utenti non potranno “cambiare la password”. Quel campo viene rimosso dal profilo utente.
  • Gli utenti non potranno più utilizzare l’autenticazione di Discourse (nome utente/password, Google, ecc).

Cosa succede se lo attivi per errore?

Vedi: Log back in as admin after locking yourself out with read-only mode or an invalid SSO configuration

Implementare DiscourseConnect sul tuo sito

:warning: Discourse utilizza gli indirizzi email per mappare gli utenti esterni agli utenti di Discourse e assume che le email esterne siano sicure. SE NON VALIDI GLI INDIRIZZI EMAIL PRIMA DI INVIARLI A DISCOURSE, IL TUO SITO SARÀ ESTREMAMENTE VULNERABILE!

In alternativa, se insisti nell’invio di email non validate, ASSICURATI di impostare require_activation=true; questo costringerà tutte le email a essere validate da Discourse. CONSIGLIAMO ANCORA FORTEMENTE DI NON FARE QUESTO, quindi se procedi con questa impostazione abilitata, assumi un rischio sostanziale.

Discourse reindirizzerà i client a discourse_connect_url con un payload firmato: (supponiamo che discourse_connect_url sia https://somesite.com/sso)

Riceverai traffico in entrata con il seguente formato:

https://somesite.com/sso?sso=PAYLOAD&sig=SIG

Il payload è una stringa codificata in Base64 composta da un nonce e un return_sso_url. Il payload è sempre una stringa di query valida.

Ad esempio, se il nonce è ABCD, il raw_payload sarà:

nonce=ABCD&return_sso_url=https%3A%2F%2Fdiscourse_site%2Fsession%2Fsso_login, questo raw payload è codificato in base 64.

L’endpoint chiamato deve:

  1. Validare la firma: assicurarsi che l’HMAC-SHA256 del PAYLOAD (utilizzando discourse_connect_secret come chiave) sia uguale al sig (sig sarà codificato in esadecimale).
  2. Eseguire l’autenticazione necessaria.
  3. Creare un nuovo payload codificato in URL contenente almeno nonce, email e external_id. Puoi anche fornire dati aggiuntivi; ecco un elenco di tutte le chiavi che Discourse comprenderà:
    • nonce deve essere copiato dal payload di input
    • email deve essere un indirizzo email verificato. Se l’indirizzo email non è stato verificato, imposta require_activation su “true”.
    • external_id è qualsiasi stringa unica per l’utente che non cambierà mai, anche se la sua email, il nome, ecc. cambiano. Il valore suggerito è il numero di riga ‘id’ del tuo database.
    • username diventerà il nome utente su Discourse se l’utente è nuovo o se SiteSetting.auth_overrides_username è impostato.
    • name diventerà il nome completo su Discourse se l’utente è nuovo o se SiteSetting.auth_overrides_name è impostato.
    • avatar_url verrà scaricato e impostato come avatar dell’utente se l’utente è nuovo o se SiteSetting.discourse_connect_overrides_avatar è impostato.
    • avatar_force_update è un campo booleano. Se impostato su true, costringerà Discourse ad aggiornare l’avatar dell’utente, indipendentemente dal fatto che avatar_url sia cambiato o meno.
    • bio diventerà il contenuto della biografia dell’utente se l’utente è nuovo, la sua biografia è vuota o SiteSetting.discourse_connect_overrides_bio è impostato.
    • title imposterà il titolo dell’utente.
    • website imposterà il sito web dell’utente nel suo profilo.
    • location imposterà la posizione dell’utente nel suo profilo.
    • profile_background_url verrà scaricato e impostato come sfondo del profilo dell’utente se l’utente è nuovo o se SiteSetting.discourse_connect_overrides_profile_background è impostato.
    • card_background_url verrà scaricato e impostato come sfondo della scheda dell’utente se l’utente è nuovo o se SiteSetting.discourse_connect_overrides_card_background è impostato.
    • locale imposterà la localizzazione dell’utente se l’utente è nuovo e SiteSetting.allow_user_locale è abilitato.
    • locale_force_update è un campo booleano. Se impostato su true insieme a locale, costringerà l’aggiornamento della localizzazione per gli utenti esistenti (richiede SiteSetting.allow_user_locale).
    • I campi booleani aggiuntivi (“true” o “false”) sono: admin, moderator, suppress_welcome_message, logout
  4. Codificare il payload in Base64.
  5. Calcolare un hash HMAC-SHA256 del payload utilizzando discourse_connect_secret come chiave e il payload codificato in Base64 come testo.
  6. Reindirizzare indietro a return_sso_url con un parametro di query sso e sig (http://discourse_site/session/sso_login?sso=payload&sig=sig).

Discourse validerà che il nonce sia valido e, se valido, lo farà scadere immediatamente in modo che non possa essere riutilizzato. Successivamente, tenterà di:

  1. Effettuare l’accesso dell’utente cercando un external_id già associato nel modello SingleSignOnRecord.
  2. Effettuare l’accesso dell’utente utilizzando l’email fornita (aggiornando external_id) (a meno che require_activation = true).
  3. Creare un nuovo account per l’utente fornendo (email, username, name) e aggiornando external_id.

Preoccupazioni sulla sicurezza

Il nonce (token monouso) scadrà automaticamente dopo 30 minuti. Ciò significa che non appena l’utente viene reindirizzato al tuo sito, ha 30 minuti per accedere o creare un nuovo account.

Il protocollo è sicuro contro gli attacchi di replay poiché il nonce può essere utilizzato solo una volta. Il nonce è legato alla sessione corrente del browser per proteggere dagli attacchi CSRF.

Specificare l’iscrizione ai gruppi

Se è specificata l’opzione discourse connect overrides groups, Discourse prenderà in considerazione l’elenco separato da virgola di gruppi passati in groups.

Oltre a groups, puoi anche specificare l’iscrizione ai gruppi nel tuo payload SSO utilizzando gli attributi add_groups e remove_groups, indipendentemente dall’opzione discourse connect overrides groups.

add_groups è un elenco separato da virgola di nomi di gruppi di cui ci assicureremo che l’utente sia membro.
remove_groups è un elenco separato da virgola di nomi di gruppi di cui ci assicureremo che l’utente non sia membro.

Implementazione di riferimento

Discourse contiene un’implementazione di riferimento della classe SSO:

Un’implementazione banale sarebbe:

class DiscourseSsoController < ApplicationController
  def sso
    secret = "MY_SECRET_STRING"
    sso = DiscourseApi::SingleSignOn.parse(request.query_string, secret)
    sso.email = "user@email.com"
    sso.name = "Bill Hicks"
    sso.username = "bill@hicks.com"
    sso.external_id = "123" # id univoco per ogni utente della tua applicazione
    sso.sso_secret = secret

    redirect_to sso.to_url("http://l.discourse/session/sso_login")
  end
end

Transizione verso e dall’autenticazione singola.

Finché il parametro require_activation non è impostato su true nel payload della richiesta, il sistema si fida delle email fornite dall’endpoint SSO. Ciò significa che se in passato avevi un account esistente su Discourse con DiscourseConnect disabilitato, DiscourseConnect lo riutilizzerà semplicemente evitando di creare un nuovo account.

Se disattivi DiscourseConnect, gli utenti potranno reimpostare le password e riaccedere ai loro account.

Esempio reale:

Dati i seguenti impostazioni:

Dominio Discourse: http://discuss.example.com
URL DiscourseConnect: http://www.example.com/discourse/sso
Segreto DiscourseConnect: d836444a9e4084d5b224a60c208dce14
Email validata: No (aggiungi require_activation=true al payload)

Tentativo di accesso dell’utente

  • Viene generato un nonce: cb68251eefb5211e58c00ff1395f0c0b

  • Viene generato il raw payload: nonce=cb68251eefb5211e58c00ff1395f0c0b

  • Il payload viene codificato in Base64: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=

  • Il payload viene codificato in URL: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI%3D

  • Viene generato un HMAC-SHA256 sul payload codificato in Base64: 1ce1494f94484b6f6a092be9b15ccc1cdafb1f8460a3838fbb0e0883c4390471

Infine, il browser viene reindirizzato a:

http://www.example.com/discourse/sso?sso=bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI%3D&sig=1ce1494f94484b6f6a092be9b15ccc1cdafb1f8460a3838fbb0e0883c4390471

All’altra estremità

  1. Il payload viene validato utilizzando HMAC-SHA256; se la firma non corrisponde, il processo si interrompe.
  2. Invertendo i passaggi sopra, viene estratto il nonce.

L’utente accede:

name: sam
external_id: hello123
email: test@test.com
username: samsam
require_activation: true

Viene generato un payload non firmato:

nonce=cb68251eefb5211e58c00ff1395f0c0b&name=sam&username=samsam&email=test%40test.com&external_id=hello123&require_activation=true

L’ordine non importa, i valori sono codificati in URL

Il payload viene codificato in Base64:

bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ==

Il payload viene codificato in URL:

bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ%3D%3D

Il payload codificato in Base64 viene firmato:

3d7e5ac755a87ae3ccf90272644ed2207984db03cf020377c8b92ff51be3abc3

Il browser viene reindirizzato a:

http://discuss.example.com/session/sso_login?sso=bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ%3D%3D&sig=3d7e5ac755a87ae3ccf90272644ed2207984db03cf020377c8b92ff51be3abc3

Sincronizzazione dei record DiscourseConnect

Puoi utilizzare l’endpoint admin POST /admin/users/sync_sso per sincronizzare un record DiscourseConnect; passagli lo stesso record che invieresti all’endpoint DiscourseConnect, il nonce non importa.

Se chiami admin/users/sync_sso da un altro sito, dovrai includere una api_key admin valida e un api_username valido negli header della richiesta. Vedi Sync DiscourseConnect user data with the sync_sso route per ulteriori dettagli su come strutturare la richiesta.

Pulizia dei record DiscourseConnect

Se i valori external_id dal tuo provider DiscourseConnect sono cambiati (magari hai cambiato l’algoritmo di generazione, oppure è un endpoint diverso), puoi rimuovere in sicurezza tutti i record esistenti utilizzando la console rails:

SingleSignOnRecord.destroy_all

Disconnessione degli utenti

Puoi utilizzare l’endpoint admin POST /admin/users/{USER_ID}/log_out per disconnettere qualsiasi utente nel sistema, se necessario.

Per configurare l’endpoint a cui Discourse reindirizza alla disconnessione, cerca l’impostazione logout redirect. Se nessun URL è stato impostato qui, verrai reindirizzato all’URL configurato in discourse connect url.

Ricerca utenti per external_id

I dati del profilo utente possono essere accessibili utilizzando l’endpoint /users/by-external/{EXTERNAL_ID}.json. Questo restituirà un payload JSON contenente le informazioni dell’utente, incluso l’user_id che può essere utilizzato con l’endpoint log_out.

Implementazioni esistenti

  • Il gem discourse_api può essere utilizzato per l’SSO. Dai un’occhiata al codice SSO nella sua directory examples per vedere un’implementazione di base.

  • Il nostro plugin WordPress rende facile configurare l’SSO tra WordPress e Discourse. I dettagli sulla configurazione si trovano nella scheda SSO della pagina delle opzioni del plugin.

Lavori futuri

  • Vorremmo raccogliere più implementazioni di riferimento per l’SSO su altre piattaforme. Se ne hai una, pubblica nella categoria Dev / SSO.

Funzionalità avanzate

  • Puoi passare campi utente personalizzati anteponendo il nome del campo con custom. Ad esempio, custom.user_field_1 può essere utilizzato per impostare il valore di UserCustomField con il nome user_field_1.
  • Puoi passare avatar_url per sovrascrivere l’avatar dell’utente (è necessario abilitare SiteSetting.discourse_connect_overrides_avatar). Gli avatar vengono memorizzati nella cache, quindi passa avatar_force_update=true per forzare l’aggiornamento se l’URL è lo stesso. Al momento, non puoi passare un URL vuoto per disabilitare l’avatar degli utenti.
  • Di default, il messaggio di benvenuto verrà inviato a tutti i nuovi utenti creati tramite SSO. Se desideri sopprimerlo, puoi passare suppress_welcome_message=true.
  • Per configurare la tua istanza Discourse come provider Discourse Connect, vedi: Utilizzare DiscourseConnect come provider di identità.

Debug del provider DiscourseConnect

Per协助 nel debug di DiscourseConnect, puoi abilitare l’impostazione del sito verbose_discourse_connect_logging. Abilitando tale impostazione, diagnostica dettagliata apparirà in TUOSITO.com/logs. Assicurati di :white_check_mark: la casella warnings in fondo a TUOSITO.com/logs.

Registreremo un avviso nei log con un dump completo del payload SSO:

  • Ogni volta che il processo DiscourseConnect viene avviato, registreremo un avviso nel log con un dump completo del payload DiscourseConnect.

  • Ogni volta che un utente non riesce a completare DiscourseConnect (a causa della scadenza del nonce o del blocco IP).

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

174 Mi Piace
Discourse SSO + normal login
Sync DiscourseConnect user data with the sync_sso route
SSO login & logout issues
Is there a "log_in" SSO API endpoint?
SSO locked me out of Discourse!
What is the SSO login URL
With SSO my user still need to hit the login button
SSO Login page not showing up
How to handle Discourse SSO when the authentication site allows users to change emails?
"User Log out API" return success in response but user session still alive
SSO integration & external profile sync help
SSO on Discourse using Atlassian Crowd
Single Sign-Out?
Mobile (firebase) SSO authentication
Login to Discourse with website account details
Discourse SSO using auth0 via URL
Users who register on my site, register also on Discourse Vise Versa
Custom Login / Registration from another API
Automatically assigning users to a group
SSO and e-mail addresses having a plus sign
Automatic session management with OAuth SSO
Merging users from different forums
Advantage and disadvantage of enabling SSO
About the SSO category
Shibboleth / SAML / SSO -- Working Implementation for Higher Ed
How to generate nonce from client-side Javascript
Logout POST Request
Customized login auth plugin
User Fields to validate users
Enable sso for my site
Disable email verification for SSO
SSO with TownNews CMS
Using existing RoR application for user auth / signup instead of discourse
[PAID] Setup SSO for self-hosted instance
SSO locked me out of Discourse!
Discourse Ruby API testing "Unknown attribute 'auth_token' for User
Switching out authentication for a passwordless alternative
A way for admins to edit users' external IDs
Hashing Secret + Payload for SSO
Will Discourse ask for a username if it's not provided to /session/sso_login?
Categorizing and tracking users
Getting signed data from the server
Getting signed data from the server
SSO and changing email addresses upstream
SSO (maybe) specific issue
SSO (maybe) specific issue
Why isn't Discourse more frequently recommended as a "community platform"?
Integration with .NET MVC application for a SaaS platform
Running my own discourse image
How do I make discourse use my platform's autentication system?
Automatic addition of users to group based on email domain
Allowing people to login using accounts from other websites
Seeking Slack Login / SSO for Discourse
Smooth J/K navigation when using keyboard
SSO to Joomla site
Discourse Connect on Local instance is not working
Implementing SSO for dev environment and troubleshoot
Login with FB, google and apple only
SSO provider implementation - Admin, moderator and groups ignored?
How to divide my community into 2 parts
Using Discourse to add a forum feature to our current application?
Shared cookie SSO: Notifying frontend
User auth with website at root and Discourse in subfolder
Can I authenticate to Drupal via Discourse?
Difficulty of Tiered-access forum
Any way to not require email verification with WP as the SSO Provider?
How to enable sso on discourse?
How to auto-login user in application web view
[PAID] automatically change user email
Create apikey for user programmatically as admin
Bug when visiting same thread url
Open source will support customized provider SSO
Is there a way to get all emails of users with the API?
How can generate _forum_session and _t for an user through code/api call or without login to browser?
Show/hide forums based on the domain? (Shared forum via CNAME)
Integrate with DjangoRest and Vue.js
Connect Discourse Auth with my Django user DB?
Disable account confirm emails when creating users via API
Transforming usernames with SSO
Automatically provision accounts with external SSO provider? (skip Create New Account prompt)
Error ArgumentError in DiscourseSsoController#sso, wrong number of arguments (given 1, expected 0)
Error ArgumentError in DiscourseSsoController#sso, wrong number of arguments (given 1, expected 0)
Embed variables in footer
Need help to setup SSO without emails
Programmatically log users out of discourse
How do I remove people from putting names? I have an API system I want in there
How to detect Discourse user on Ghost Blog?
Problem in sso redirection for compose a new pre-filled topic via URL
How to make default avatars and make sure nobody changes there avatar I want to set them an avatar with my API system
How might we better structure #howto?
Is Roblox Login Possible?
Discourse login with whmcs users
2.7.0.beta4: DiscourseConnect, Topic Timer UI revamp, Login Modal UI revamp, and more
Connecting Discourse invites to Marketo emails
Auto assign member to the certain group
Connecting to an external source of avatars?
Changing avatar_url while sso_overrides_avatar is set?
SSO - User Roles or ACLs to differentiate access levels
SSO - User Roles or ACLs to differentiate access levels
Disabling email verification
SSO Isnt working for me
Could Discourse offer a StackExchange-like SSO/Federated login service?
Mandatory username & avatar generation - How can we do this?
Intergrading discoures in to a application
Configure single sign-on (SSO) with WP Discourse and DiscourseConnect
How to connect to an external database running on localhost
Automate User Creation
Login Help - Correct way to login
What happens to my current users after configuring SSO?
SSO groups without completely overriding
JumpCloud LDAP/SSO
Usernames getting modified – numeral “1” being added
Is "partial" SSO possible?
Send an invite to a user but complete their profile programmatically
Magento 2 as SSO Provider?
Discourse SSO Provider doesn't redirect to return_sso_url as user logs in with custom SSO
Force password change after login
SSO and e-mail addresses having a plus sign
Would Discourse meet all of these niche needs to be a video game community forum?
OpenID Connect and SSO
Does `sso overrides groups` work with Oauth2?
Add user to group after purchase
Shibboleth SSO with Discourse
Using discourse forum in a native app (log-in, languages)
Discourse Connect: How implementing Discourse login with an existing database?
Sync group membership with external list of email addresses
Can I use my own Login page instead of discourse's Default login dialog box?
Modify the URL of 'create your account' button to an external site
How to add a custom url text link on the login page
Can discourse delete archived posts automatically and accept registration without email?
SSO is forcibly creating the user as an admin
Onboarding 15k Trial Users/Year: Need Help Streamlining the Process
Is DiscourseConnect available for self-hosted?
Is DiscourseConnect available for self-hosted?
How to Disable Required SSO Email Activation
User avatar selection through API no longer working
Wordpress plugin not redirect to discourse login automatically
Discourse login by cookie token
Custom field in discourseconnect
Logging users in through c++ desktop application
Invite only by email from database
Is it possible to autologin discourse via iframe?
Login w/ Discourse w/o SSO?
Wordpress plugin not redirect to discourse login automatically
Discourse Hosting Limits?
DiscourseConnect always returns "Nonce is incorrect, ..."
Has anyone succeeded in using discourse as sso provider for nextcloud? Share recipe?
SSO in C# .NET App
Intergrate Discourse with keycloak
Allow my application users to login to discourse
Feature: create default user name from email's user portion when using Google OAuth2/SSO
SSO login appears to have stopped working
Is there a way to use both local login and discourseConnect?
Discourse Hosting Limits?
Changing email addresses not working as an Admin
Populating email field on login page
Problem on SSO Login
SSO Broken - The requested URL or resource could not be found
Adding Discourse to existing Ruby on Rails site
Can I use DiscourseConnect along with Discourse Native Registration?
SSO Login with Discourse
Synchronize SSO login state between Discourse and provider
Connection and discourse account creation without going on discourse
Migrate an IPB 3.1 forum to Discourse
Disable DiscourseConnect
How to use Discourse Connect (SSO) to update avatar, username, name?
Label Sets
Unable to setup discourse in my windows 10
Embed Discourse comments on another website via Javascript
How admin user re-logins after using discourse connect sso and custom domain
How to "intercept" first time SSO usages to let users confirm the SSO action and set a username?
How to create a login on my front-end application to a specific Discourse site?
Use Discourse as an identity provider (SSO, DiscourseConnect)
Connect discourse with magento?
Users allowed to see only some categories
Admin status repeatedly revoked
Plugin to integrate Shopify accounts with Discourse
How to do single sign-on with forum program?
Simple login by email via deep links containing a username
How to set language for SSO users
Want to set internal forum on our reactjs member's platform
New instructions for SSO setup? "enable discourse connect" setting is missing
Add a new user via API
Configure GitHub login for Discourse
Use SSO to auto create Discourse login/password after signed up in my SaaS
How can I change the registration URL?
How do I go about making a very customized theme?
Unable to disable SSO via SSH
Is it possible to have an automatically updating link to a user's profile picture? Such as by giving each user one "slot" for an avatar?
SSO broken after rebuild with stable v3.3.3
Using Discourse Connect with a mobile app
Disable DiscourseConnect
Missing anchor links in certain TOC topics?
Integration into custom auth system where emails are not unique?
WP-Discourse not connected and admin email not recognized
How to disable SMTP during installation?
Auto Login to my Discourse site / subdomain
How to Disable activation_reminder email sending?
Extending header buttons
Auth via Discourse Forum
🧩 How to Build an Android App User Community with Discourse? [HeyApks Project]
Postgres doesn't seem to be running when running Discourse locally using Docker
Discourse sso login redirect to localhost:3000, not 4200 (running via docker)
Cross-Discourse Quoting
Is it Possible to Send Encrypted Email and Password in the Authentication Flow?
Nutzung von Nextcloud aus Discourse heraus
Inherited forum with old Discourse Connect Config and Looking for Some Guidance
Merging user accounts
Understanding PII storage in Discourse
Auto-provisioning user accounts when SSO is enabled
REQUEST: Highly Effective Age Assurance (OneID Phone No. Age Verification) Integration
Intergrate Discourse with keycloak
Auto-sign-in with the OpenId Connect Plugin and AWS Cognito
How can I configure Single Sign On for our App to the Discourse Community Forum
Auto-assign random, anonymous usernames
Communities using discourse SSO for their in-app community experience
Login to Discourse with custom Oauth2 provider
Can I log into multiple instances of discourse simultaneously?
Upgraded last night and login button no longer works
SSO with Roles translating to Groups
Redirect login possible?
How to disable SSO via SSH
Connect Multiple WP Sites To 1 Discourse Installation?
What is the procedure to obtain CAS between my website and my discourse instance?
Problem logging in using SSO plugin
PAID: Create Open Source SSO plugin to auth with Wild Apricot
Trouble connecting drupal and discourse
About the idea: IDENTITY = EMAIL
About the idea: IDENTITY = EMAIL
Consequences of not validating email addresses
SSO and Restricted Groups
Questions about Discourse on Digital Ocean
Require users to join at least one group at sign-up
Use the same user database and login credentials in multiple discourse instances
How to connect my (existing) User Database?
User group sync with drupal
Options with SSO with another custom application
Issues in Integrating SSO in Discourse
How to implement Discourse with an already built Rails project
Updating SSO documentation
Configuring SSO to Work With SocialEngine
Updating SSO documentation
Discourse view file update does not reflect in browser
Discourse view file update does not reflect in browser
Trying to set up SSO
Discourse doesn't re-verify an address changed by SSO
Discourse doesn't re-verify an address changed by SSO
SSO and Discourse Consulting
Changing the unique key to identify users
Setting the user title(group?) based on the information that is coming from the sso payload
Advice needed for tailoring Discourse to my organisation
Primary and Discourse Site Integrations
Automatic Table of Contents generation
Questions Regarding Account Authentication Methods
Redirect all users who click on domain.com/signup to a different page
Poll Result Breakdown
Cant update email via API - invalid_access error
Disabling all emails except those registration related?
Can't get avatar overrides to work over SSO
Conflicting email addresses, giving admins more power to resolve issues
Which Discourse hosting tier should I choose?
New users via API if allow new unchecked
How to change login settings without being logged in?
Data explorer query to list the longest "estimated read time" topics?
Create user in discourse by redirecting from another site
HMAC-256 example on Official SSO page
Add links to meta.discourse.org instructions inside admin
How to configure the SSO Authorization URL via config (without using the admin panel)
TeamAndro exploring a migration from phpBB
DiscourseConnect payload hash encoding mismatch
Disabling SSO in development environment
Getting signed data from the server

Ciao, è difficile per me trovare informazioni, ma quale protocollo utilizza? Si presume oauth2? I parametri non sembrano corrispondere e ricevo un errore dal provider che sembra accettare un parametro sso=? Aiuto!

grazie

DiscourseConnect è l’implementazione di SSO di Discourse. Non utilizza un protocollo standard.

Se non ti dispiace guardare il codice PHP, c’è un esempio di implementazione qui: wp-discourse/lib/sso-provider/discourse-sso.php at main · discourse/wp-discourse · GitHub.

Sì, non funzionerà. Se hai un provider OAuth2 che vorresti utilizzare per autenticare gli utenti, dai un’occhiata al plugin Discourse OAuth2 Basic.

1 Mi Piace

Grazie @simon. Anche il codice PHP è un provider e non un consumer? Ho anche visto un provider OIDC che potrebbe funzionare e anche un provider “intermediario” nell’area dei plugin.

Se il provider SSO non è standard, allora per chi/cosa è inteso se non funziona bene con gli altri?

Grazie ancora!

Il codice a cui ho fatto riferimento serve per usare WordPress come provider di autenticazione per Discourse.

Il plugin WordPress permette anche a WordPress di essere usato come client DiscourseConnect: wp-discourse/lib/sso-client at main · discourse/wp-discourse · GitHub.

Non sono sicuro quale fosse la motivazione per aggiungere un’implementazione SSO personalizzata a Discourse. Immagino ci fosse un caso aziendale per questo.

Un vantaggio che fornisce è che permette a un sito esterno di essere strettamente integrato con Discourse. Ad esempio, tutti gli attributi utente elencati qui possono essere sincronizzati con Discourse durante il processo di autenticazione: discourse/lib/discourse_connect_base.rb at 7b89fdead98606d4f47ceb0a1d240d0f6e5f589e · discourse/discourse · GitHub.

Permette anche a siti che non sono configurati per essere provider OAuth2 o OpenID Connect di essere usati per autenticare gli utenti su Discourse.

Lo svantaggio è che richiede l’aggiunta di codice personalizzato al sito del provider di autenticazione.

1 Mi Piace

Ciao, sono curioso di sapere quali siano i problemi derivanti dalla mancata verifica degli indirizzi email su un sito esterno che fornisce l’SSO. Si tratta solo di abilitare lo spam automatico? O ci sono altre considerazioni? Perché non è consigliabile che Discourse gestisca la verifica delle email se il sito esterno non lo fa?

Grazie per qualsiasi ulteriore approfondimento.

Lo scenario peggiore di cui sono a conoscenza richiede queste condizioni:

  • gli indirizzi email non sono verificati sul sito esterno
  • require_activation=true non è impostato nel payload SSO
  • ci sono account esistenti sul sito Discourse che non hanno un SingleSignOnRecord associato (il proprietario dell’account non ha mai effettuato l’accesso a Discourse tramite SSO)

In quel caso, qualcuno potrebbe registrarsi sul sito esterno utilizzando l’indirizzo email di un utente Discourse che non ha mai effettuato l’accesso tramite SSO. Ciò consentirebbe all’account non verificato dal sito esterno di impossessarsi dell’account Discourse che utilizza lo stesso indirizzo email. Ciò sarebbe particolarmente preoccupante se si trattasse di un account amministratore su Discourse.

È consigliato che Discourse gestisca la verifica dell’email se il sito esterno non la gestisce:

Ci sono un paio di ragioni per cui è meglio gestire la verifica dell’email sul sito esterno:

  • forzare gli utenti a ricevere l’email di conferma da Discourse aggiunge un attrito quando gli utenti tentano per la prima volta di accedere a Discourse. (Realisticamente, quell’attrito deve comunque avvenire da qualche parte, o da parte di Discourse o da parte del sito esterno.)
  • Discourse non assocerà gli account Discourse esistenti agli accessi esterni in base all’indirizzo email se require_activation è impostato su true nel payload SSO. Questo è un problema se abiliti DiscourseConnect dopo che alcuni account sono stati creati su Discourse registrandosi con nome utente/password. È anche un problema se per qualsiasi motivo devi eliminare le voci SingleSignOnRecord su Discourse. Discourse non creerà automaticamente nuove voci SingleSignOnRecord quando gli utenti tenteranno di accedere nuovamente a Discourse.
4 Mi Piace

Grazie, @simon, è molto utile!

Ciao, ho una domanda riguardo al campo groups nel payload SSO.

Anche i gruppi automatizzati (come amministratori, moderatori e livelli di fiducia) verranno sovrascritti? O verranno mantenuti?

No! Supponendo che la descrizione di tale impostazione sia corretta, influenzerà solo i gruppi manuali.

Sai cosa… non ho visto la parola “manuale” nella descrizione. Sembra promettente per il mio caso d’uso, ci proverò e ti farò sapere.

1 Mi Piace

Quando ho letto questo, pensavo di dover generare la firma direttamente dal payload codificato in base64. Non mi ero reso conto che fosse necessario generarla dai byte UTF-8. Potrebbe essere chiarito?

Sto giocando con DiscourseConnect: la documentazione è ottima, grazie.
Tuttavia, ho riscontrato alcuni ostacoli per i quali spero di ricevere aiuto/chiarimenti.

Vogliamo che gli utenti possano accedere a WordPress utilizzando il loro login Discourse (che funziona bene :slight_smile: ) - tuttavia.

  • È possibile creare un utente WordPress tramite la registrazione a Discourse (quando un utente crea un account utente Discourse, crea automaticamente un account/profilo WordPress per loro in modo che possano accedere a WordPress)

  • È possibile sincronizzare i gruppi utente di WordPress e i gruppi Discourse.
    Se un utente ha sia un account utente WordPress che Discourse, DiscourseConnect è in grado di unirli, ma non assegna all’account WordPress i gruppi utente dei gruppi Discourse con lo stesso nome, e viceversa (e cosa succede se i gruppi non hanno lo stesso nome - come posso dire a DiscourseConnect di assegnare il gruppo utente ‘Testing Group’ quando l’utente ha il gruppo Discourse ‘Group for Testing Things’?

Cosa mi sto perdendo?

Non conosco la risposta, ma…

Fai attenzione. È da qualche parte illegale e una pratica considerata ampiamente scorretta (al di fuori dei proprietari del sito, ovviamente :smirking_face:) perché accadrebbe senza il consenso e la conoscenza dell’utente, e allo stesso tempo i dati verrebbero spostati altrove.

Certo, è un po’ un’area grigia e, fondamentalmente, ad esempio, Google lo fa.

Ma… perché? Limita l’accesso solo a Discourse SSO sul lato WordPress e reindirizza gli utenti a Discourse per la creazione dell’account e basta. Ma per quanto ne so, non puoi sincronizzare automaticamente gli account utente fuori dalla scatola. E perché dovresti, dato che con SSO avviene quando un utente ne ha bisogno.

Nel nostro scenario (come organizzazione associativa)

  • Wordpress viene utilizzato per gestire gli abbonamenti, acquistare articoli sul negozio Wordpress e utilizziamo i Gruppi Utente per gestire ciò che un membro può fare nell’organizzazione
  • Discourse è il nostro forum/comunità online e utilizziamo i Gruppi per controllare a quali aree di Discourse un utente ha accesso)

Attualmente un nuovo membro deve creare un account Wordpress (e impostare il proprio abbonamento, ecc.) e anche creare un account Discourse, e i Gruppi Utente-Gruppi Discourse sono gestiti/sincronizzati manualmente.

Sto cercando una soluzione in cui un nuovo utente effettui una sola configurazione per creare entrambi gli account e i Gruppi Utente-Gruppi Discourse vengano sincronizzati automaticamente - sono sicuro che riuscirò a risolvere la sincronizzazione dei Gruppi con le API, ecc. È la configurazione multi-account utente che sto cercando di risolvere/evitare.

Sembra che tu stia usando Discourse come provider SSO per WordPress. Questo approccio è descritto qui: Usa Discourse come identity provider (SSO, DiscourseConnect). Il plugin Discourse per WordPress ha opzioni sia per usare WordPress come provider SSO per Discourse, sia per usare Discourse come identity provider per WordPress. Usare lo stesso nome per entrambi gli approcci crea un po’ di confusione.

Sarei tentato di usare WordPress come identity provider per questo caso. Con questo approccio, gli utenti creeranno account sul tuo sito WordPress e poi accederanno a Discourse con le loro credenziali WordPress. Una cosa da tenere presente con questo approccio è che significa che gli utenti potranno accedere a Discourse solo tramite WordPress, non sarà possibile creare un account Discourse senza avere già un account WordPress. Penso che questa sia la configurazione appropriata quando si integra Discourse con un sito di appartenenza WordPress.

Quando WordPress viene utilizzato come identity provider per Discourse, ci sono un paio di funzioni di utilità utili per impostare le appartenenze ai gruppi di Discourse degli utenti in base alla loro attività su WordPress. Queste funzioni sono descritte qui: Gestisci l’appartenenza ai gruppi in Discourse con WP Discourse SSO.

Tornando alla tua domanda originale:

È passato un po’ di tempo da quando ho esaminato il codice del client DiscourseConnect del plugin WordPress, ma penso che ciò che stai chiedendo sia più o meno il modo in cui quel codice è previsto per funzionare. Se un utente ha un account Discourse, deve solo fare clic sul link “Accedi tramite Discourse” su WordPress e verrà creato un account per lui.

Questo sarebbe tecnicamente possibile quando si utilizza WordPress come client DiscourseConnect, ma a meno che qualcosa non sia cambiato, non sarai in grado di utilizzare i metodi add_user_to_discourse_group e remove_user_from_discourse_group che sono descritti nella documentazione che ho collegato. Dovresti fare qualcosa come impostare un Webhook di Discourse che viene attivato quando un utente viene aggiunto a un gruppo di Discourse, quindi aggiungere del codice su WordPress per elaborare quel webhook. Per sincronizzare i gruppi da WordPress a Discourse, dovresti effettuare una chiamata API a Discourse per aggiornare i gruppi di un utente quando c’è una modifica su WordPress. Quindi, qualcosa che sarebbe abbastanza facile da realizzare se usi WordPress come provider DiscourseConnect potrebbe essere piuttosto complicato se usi WordPress come client DiscourseConnect.

1 Mi Piace

Tranne se viene utilizzato l’accesso personalizzato, come di solito accade con WooCommerce/membership/LLM che mostrano quel pulsante e forzare l’uso del solo SSO di Discourse come provider non avviene immediatamente e richiede un po’ di lavoro personalizzato.

Ci sono un paio di possibili problemi, uno relativo alla cache e un altro relativo ai reindirizzamenti di accesso aggiunti da alcuni plugin. Chiunque riscontri questi problemi dovrebbe chiedere informazioni nella categoria Support > WordPress. Di solito si risolvono facilmente.

Ho completamente dimenticato di riferire: in effetti funziona esattamente come descritto, solo i gruppi manuali sono interessati.

Ciao @simon,
Penso di aver davvero bisogno di aiuto per la risposta 404 dalla mia POC di questa funzionalità SSO. Sto lavorando su questo problema da un giorno intero, ma non riesco ancora a capire qual è il problema. Sono stato in grado di:

  1. Abilitare discourse_connect
  2. Impostare discourse_connect_url su https://localhost:4200/login
  3. Segreto discourse-connect: 20’s (1) 1111111111111111111 per mantenerlo semplice

Quindi, nella mia pagina di accesso della mia app Angular, ho inviato questa richiesta seguendo il codice:


ma ho ricevuto la risposta 404 non trovata.

Per quanto ho capito, durante l’invio di una richiesta POST all’endpoint admin/users/sync_sso, se l’utente non esisteva in discourse, dovrebbe creare un nuovo utente basato su user_id e email, quindi il risultato restituito dovrebbe essere un oggetto utente e non un oggetto vuoto con codice di stato 404.
Ho anche controllato il log, ma non ha fornito alcuna informazione correlata a questa risposta fallita.

Grazie in anticipo!