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
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
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 emailauth overrides usernameauth overrides namediscourse connect overrides avatardiscourse connect overrides biodiscourse connect overrides groupsdiscourse connect overrides profile backgrounddiscourse connect overrides card backgrounddiscourse connect overrides locationdiscourse 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.