DiscourseConnect-Benutzerdaten mit der sync_sso-Route synchronisieren

Single Sign-On kann verwendet werden, um die Discourse-Benutzerauthentifizierung von einer separaten Website aus zu verwalten. Das Thema unter Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) enthält Details zur Implementierung von DiscourseConnect.

Das Problem

Mit DiscourseConnect werden Discourse-Benutzer erstellt oder aktualisiert, wenn sie sich von Ihrer externen Website aus bei Discourse anmelden. Was jedoch nicht abgedeckt wird, ist der Fall, in dem Sie Discourse-Benutzer erstellen oder aktualisieren müssen, ohne dass sie sich auf Ihrer Website anmelden. Für Sites, die DiscourseConnect verwenden, sollten diese Fälle durch eine authentifizierte POST-Anfrage an die Route sync_sso behandelt werden.

:information_source: Wenn Sie die Discourse-API-Bibliothek (Gem) verwenden, können Sie stattdessen die Methode sync_sso des Gems nutzen. Im Verzeichnis examples finden Sie Anweisungen zur Verwendung dieser Methode.

Als Beispiel betrachten wir den Fall, dass ein Benutzer auf der übergeordneten Site zu einer Gruppe hinzugefügt wird und er ohne vorherige Anmeldung mit DiscourseConnect zu einer entsprechenden Gruppe auf Discourse hinzugefügt werden muss. Der Name der Gruppe ist sowohl auf der Website als auch im Forum ‘eurorack’. Die external_id des Benutzers ist 1 und seine E-Mail-Adresse lautet bob@example.com. Der folgende Code verwendet PHP. Das Grundprinzip lässt sich auf jede Programmiersprache übertragen.

Einrichten Ihrer API-Anmeldedaten und des SSO-Geheimnisses

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

Einrichten der SSO-Parameter

Um zu sehen, welche Parameter verfügbar sind, werfen Sie einen Blick auf den Abschnitt ACCESSORS in discourse_connect_base.rb. Der Parameter, den Sie zwingend angeben müssen, um einen bestehenden Benutzer zu aktualisieren, ist external_id. Wenn Sie sync_sso für einen Benutzer aufrufen, der noch nicht auf Discourse existiert, müssen Sie die Parameter username und email angeben. Discourse verwendet username und email, um einen neuen Benutzer zu erstellen.

Um einen Benutzer zu einer Gruppe hinzuzufügen, geben Sie den Parameter add_groups an. Um einen Benutzer aus einer Gruppe zu entfernen, geben Sie den Parameter remove_groups an. Der Wert für beide Parameter muss als durch Kommas getrennte Zeichenfolge von Gruppennamen festgelegt werden. Zwischen den Gruppennamen sind keine Leerzeichen erlaubt.

:information_source: Der Parameter require_activation ist im Payload enthalten. Dieser sollte auf true gesetzt werden, wenn die E-Mail-Adresse des Benutzers auf der übergeordneten Site noch nicht validiert wurde. Bei PHP muss der Parameter auf den String ‘true’ gesetzt werden, damit er nicht in die Zahl 1 umgewandelt wird. Wenn Sie die E-Mail-Adresse des Benutzers bereits validiert haben, müssen Sie diesen Parameter nicht angeben.

// Erstellen Sie ein Array mit SSO-Parametern.
$sso_params = array(
    'external_id' => 1,
    'email' => 'bob@example.com',
    'username' => 'bob',
    'add_groups' => 'eurorack',
    'require_activation' => 'true',
);

// Konvertieren Sie die SSO-Parameter in den SSO-Payload und generieren Sie die SSO-Signatur.
$sso_payload = base64_encode( http_build_query( $sso_params ) );
$sig = hash_hmac( 'sha256', $sso_payload, $discourse_connect_secret );

Senden der POST-Anfrage

Für dieses Beispiel verwende ich curl, setze den user_agent auf ‘WordPress/4.9.4’ und die Forum-URL auf https://forum.example.com.

$url = 'https://forum.example.com/admin/users/sync_sso';
$post_fields = array(
    'sso' => $sso_payload,
    'sig' => $sig,
);
$headers = array("Content-Type: multipart/form-data;","Api-Key: $api_key","Api-Username: $api_username",);

$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $post_fields ) );
curl_setopt( $ch, CURLOPT_USERAGENT, 'WordPress/4.9.4' );

$result = curl_exec( $ch );

if ( curl_errno( $ch ) !== 0 ) {
    // Fehler behandeln, curl_close( $ch ) aufrufen und zurückkehren.
}

curl_close( $ch );

$discourse_user = json_decode( $result );

Aktualisierung bestehender Benutzer

Anfragen an die Route sync_sso aktualisieren Eigenschaften bestehender Benutzer auf die gleiche Weise, als ob der Benutzer sich mit DiscourseConnect auf der Site angemeldet hätte. Das bedeutet, dass die Werte der Site-Einstellungen auth overrides und discourse connect overrides für diese Anfragen berücksichtigt werden. Um beispielsweise die E-Mail-Adresse bestehender Benutzer mit Anfragen an sync_sso zu aktualisieren, muss die Einstellung auth overrides email aktiviert sein. Hier sind die relevanten Einstellungen:

  • 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

Weiterführende Literatur

Um zu sehen, was im Hintergrund passiert, werfen Sie einen Blick auf den sync_sso-Code, die DiscourseConnectBase-parse-Methode und die DiscourseConnect-lookup_or_create_user-Methode.

Es gibt auch eine JavaScript-Version dieses Leitfadens für diejenigen, die Node.js verwenden.

32 „Gefällt mir“
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?

Meldung erhalten: {"failed":"FEHLGESCHLAGEN","message":"Anmeldefehler"}