Sincronizza i dati utente di DiscourseConnect con la rotta sync_sso

Single Sign On può essere utilizzato per gestire l’autenticazione degli utenti Discourse da un sito separato. Il topic Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) contiene i dettagli su come implementare DiscourseConnect.

Il Problema

Con DiscourseConnect, gli utenti Discourse verranno creati o aggiornati quando accedono a Discourse dal tuo sito esterno. Tuttavia, non gestisce i casi in cui è necessario creare o aggiornare utenti Discourse senza che questi accedano al tuo sito. Per i siti che utilizzano DiscourseConnect, questi casi devono essere gestiti effettuando una richiesta POST autenticata alla rotta sync_sso.

\u003e :information_source: Se stai utilizzando il gem Discourse API, puoi usare il metodo sync_sso del gem invece del codice seguente. Consulta la directory examples per istruzioni su come utilizzare il metodo.

Come esempio, consideriamo un caso in cui un utente viene aggiunto a un gruppo sul sito principale e deve essere aggiunto al gruppo corrispondente su Discourse senza dover prima accedere con DiscourseConnect. Il nome del gruppo sia sul sito web che sul forum è ‘eurorack’. L’external_id dell’utente è 1 e la sua email è bob@example.com. Il codice seguente utilizza PHP. L’idea di base può essere applicata a qualsiasi linguaggio di programmazione.

Configura le credenziali API e la chiave segreta SSO

\n$api_key = '4fe83002bb5fba8c9a61a65e5b4b0a3cf8233b0e4ccafc85ebd6607abab4651a';\n$api_username = 'system';\n$discourse_connect_secret = 'jdhb19*Xh3!nu(#k';\n

Configura i parametri SSO

Per vedere quali parametri sono disponibili, consulta la sezione ACCESSORS di discourse_connect_base.rb. Il parametro che devi includere per aggiornare un utente esistente è external_id. Se stai chiamando sync_sso per un utente che non esiste ancora su Discourse, devi includere i parametri username ed email. Discourse utilizzerà username ed email per creare un nuovo utente.

Per aggiungere un utente a un gruppo, includi il parametro add_groups. Per rimuovere un utente da un gruppo, includi il parametro remove_groups. Il valore per entrambi questi parametri deve essere impostato su una stringa di nomi di gruppo separati da virgole. Non sono consentiti spazi tra i nomi dei gruppi.

\u003e :information_source: Il parametro require_activation è incluso nel payload. Deve essere impostato su true se l’email dell’utente non è stata validata sul sito principale. Con PHP il parametro deve essere impostato sulla stringa ‘true’ per evitare che venga convertito nel numero 1. Se hai già validato l’indirizzo email dell’utente, non è necessario includere questo parametro.

\n// Crea un array di parametri SSO.\n$sso_params = array(\n 'external_id' =\u003e 1,\n 'email' =\u003e 'bob@example.com',\n 'username' =\u003e 'bob',\n 'add_groups' =\u003e 'eurorack',\n 'require_activation' =\u003e 'true',\n);\n\n// Converti i parametri SSO nel payload SSO e genera la firma SSO.\n$sso_payload = base64_encode( http_build_query( $sso_params ) );\n$sig = hash_hmac( 'sha256', $sso_payload, $discourse_connect_secret );\n

Invia la richiesta POST

Per questo esempio userò curl, impostando user_agent su ‘WordPress/4.9.4’ e l’URL del forum su https://forum.example.com

\n$url = 'https://forum.example.com/admin/users/sync_sso';\n$post_fields = array(\n 'sso' =\u003e $sso_payload,\n 'sig' =\u003e $sig,\n);\n$headers = array(\"Content-Type: multipart/form-data;\",\"Api-Key: $api_key\",\"Api-Username: $api_username\",);\n\n$ch = curl_init();\ncurl_setopt( $ch, CURLOPT_URL, $url );\ncurl_setopt( $ch, CURLOPT_POST, 1 );\ncurl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );\ncurl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );\ncurl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $post_fields ) );\ncurl_setopt( $ch, CURLOPT_USERAGENT, 'WordPress/4.9.4' );\n\n$result = curl_exec( $ch );\n\nif ( curl_errno( $ch ) !== 0 ) {\n // Gestisci l'errore, chiama curl_close( $ch ) e restituisci.\n}\n\ncurl_close( $ch );\n\n$discourse_user = json_decode( $result );\n

Aggiornamento di utenti esistenti

Le richieste inviate alla rotta sync_sso aggiorneranno le proprietà degli utenti esistenti nello stesso modo in cui accadrebbe se l’utente accedesse al sito con DiscourseConnect. Ciò significa che i valori delle impostazioni del sito auth overrides e discourse connect overrides del tuo sito saranno rispettati per queste richieste. Ad esempio, per aggiornare l’indirizzo email degli utenti esistenti con richieste a sync_sso, è necessario abilitare l’impostazione auth overrides email. Ecco le impostazioni pertinenti:

  • auth overrides email
  • auth overrides username
  • auth overrides name
  • discourse connect overrides avatar
  • discourse connect overrides bio
  • discourse connect overrides groups
  • discourse connect overrides profile background
  • discourse connect overrides card background
  • discourse connect overrides location
  • discourse connect overrides website

Ulteriori letture

Per vedere cosa succede, consulta il codice sync_sso, il metodo parse di DiscourseConnectBase e il metodo lookup_or_create_user di DiscourseConnect.

Esiste anche una versione JavaScript di questa guida per chi utilizza Node.js.

32 Mi Piace
Sync DiscourseConnect user data with the sync_sso route [JavaScript]
/admin/users/sync_sso ... Route not found
SSO_SYNC not working
Using the API to create a user on an SSO only system
SSO integration & external profile sync help
Creating Discourse accounts via SSO without visiting the forum URL?
Sync_sso post suddenly resulting in 404 not found after succesfully adding a portion of the users
Changing avatar_url while sso_overrides_avatar is set?
"push" sso users to discourse?
Groups API - manually syncing group membership?
SSO_SYNC not working
PHP/API to check whether user exists (by email) and is in specific group
Pre-create user accounts for SSO users
User profile page by id?
DiscourseConnect Provider Questions
Logging in discourse using API - using discourse as API server only
I cannot add user to the discouse forum from a wordpress website when user added in a membership
Integration into custom auth system where emails are not unique?
:cn: Synchronizing DiscourseConnect user data using sync_sso [Java] | 使用 sync_sso 同步 DiscourseConnect 用户数据 [Java]
Letting users choose whether to show Full Name
Auto-provisioning user accounts when SSO is enabled
Creating Discourse accounts during user import
Refresh sso groups
/admin/users/sync_sso 403 Forbidden
Triggering automatic authentication via SSO when linking to private topics?
"BAD CSRF" when executing PUT using API, curl, and PHP
Delete user avatar by API
Delete user avatar by API
Help me troubleshoot my Discourse SSO
Adding existing (and inviting new) users to a group
Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso)
DiscourseConnect, SSO and E-Mail address confirmation
AUTOMATIC: Inviting every new SaaS signup into the Discourse Forum
Question necromancy: migrating from mattermost
Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso)
How to "intercept" first time SSO usages to let users confirm the SSO action and set a username?
API Create user external_ids parameter
First time login for a user using API KEY
How to use Discourse Connect (SSO) to update avatar, username, name?
How to set language for SSO users
What are your experiences with wp-discourse plugin and DiscourseConnect?

Ricezione di questo messaggio: {"failed":"FALLITO","message":"Errore di accesso"}