مزامنة بيانات مستخدم DiscourseConnect مع مسار sync_sso

يمكن استخدام الدخول الموحد (Single Sign On) للتعامل مع مصادقة مستخدمين Discourse من موقع منفصل. يحتوي الموضوع Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) على تفاصيل حول كيفية تنفيذ DiscourseConnect.

المشكلة

مع DiscourseConnect، يتم إنشاء أو تحديث مستخدمين Discourse عند تسجيل دخولهم إلى Discourse من موقعك الخارجي. لكن ما لا يتعامل معه هو الحالات التي تحتاج فيها إلى إنشاء أو تحديث مستخدمين Discourse دون أن يقوموا بتسجيل الدخول إلى موقعك. بالنسبة للمواقع التي تستخدم DiscourseConnect، يجب التعامل مع هذه الحالات عن طريق إرسال طلب POST مصادق عليه إلى مسار sync_sso.

:information_source: إذا كنت تستخدم مكتبة Discourse API (gem)، فيمكنك استخدام دالة sync_sso الخاصة بالمكتبة بدلاً من استخدام الكود التالي. راجع دليل الأمثلة للحصول على تعليمات حول كيفية استخدام الدالة.

كمثال، سنتناول حالة يتم فيها إضافة مستخدم إلى مجموعة في الموقع الرئيسي، ويحتاج إلى إضافته إلى مجموعة مقابلة في Discourse دون الحاجة إلى تسجيل الدخول أولاً باستخدام DiscourseConnect. اسم المجموعة في كل من الموقع والمنتدى هو ‘eurorack’. external_id للمستخدم هو 1 و بريده الإلكتروني هو bob@example.com. يستخدم الكود التالي لغة PHP. يمكن تطبيق الفكرة الأساسية على أي لغة برمجة.

إعداد بيانات اعتماد واجهة برمجة التطبيقات ومفتاح سر SSO

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

إعداد معلمات sso

لمعرفة المعلمات المتاحة، راجع قسم ACCESSORS في ملف discourse_connect_base.rb. المعلمة التي يجب تضمينها لتحديث مستخدم موجود هي external_id. إذا كنت تستدعي sync_sso لمستخدم غير موجود بعد في Discourse، فيجب عليك تضمين معلمات username و email. سيقوم Discourse باستخدام username و email لإنشاء مستخدم جديد.

لإضافة مستخدم إلى مجموعة، قم بتضمين معلمة add_groups. لإزالة مستخدم من مجموعة، قم بتضمين معلمة remove_groups. يجب أن تكون القيمة لأي من هاتين المعلمتين عبارة عن سلسلة مفصولة بفواصل من أسماء المجموعات. لا يُسمح بمسافات بين أسماء المجموعات.

:information_source: يتم تضمين معلمة require_activation في الحمولة (payload). يجب تعيينها إلى true إذا لم يتم التحقق من صحة بريد المستخدم الإلكتروني في الموقع الرئيسي. مع لغة PHP، يجب تعيين المعلمة إلى السلسلة ‘true’ لتجنب تحويلها إلى الرقم 1. إذا قمت بالتحقق من صحة عنوان البريد الإلكتروني للمستخدم، فلا تحتاج إلى تضمين هذه المعلمة.

// إنشاء مصفوفة من معلمات SSO.
$sso_params = array(
    'external_id' => 1,
    'email' => 'bob@example.com',
    'username' => 'bob',
    'add_groups' => 'eurorack',
    'require_activation' => 'true',
);

// تحويل معلمات SSO إلى حمولة SSO وتوليد توقيع SSO.
$sso_payload = base64_encode( http_build_query( $sso_params ) );
$sig = hash_hmac( 'sha256', $sso_payload, $discourse_connect_secret );

إرسال طلب POST

في هذا المثال سأستخدم curl، وأضبط user_agent على ‘WordPress/4.9.4’، وعنوان URL للمنتدى على 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 ) {
    // التعامل مع الخطأ، استدعاء curl_close( $ch ) والعودة.
}

curl_close( $ch );

$discourse_user = json_decode( $result );

تحديث المستخدمين الموجودين

ستقوم الطلبات المرسلة إلى مسار sync_sso بتحديث خصائص المستخدمين الموجودين بنفس الطريقة التي تحدث بها إذا قام المستخدم بتسجيل الدخول إلى الموقع باستخدام DiscourseConnect. وهذا يعني أن قيم إعدادات الموقع auth overrides و discourse connect overrides في موقعك سيتم احترامها لهذه الطلبات. على سبيل المثال، لتحديث عنوان البريد الإلكتروني للمستخدمين الحاليين باستخدام طلبات sync_sso، يجب تفعيل إعداد auth overrides email. إليك الإعدادات ذات الصلة:

  • 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

قراءات إضافية

لمعرفة ما يحدث، راجع كود sync_sso، ودالة DiscourseConnectBase parse، ودالة DiscourseConnect lookup_or_create_user.

هناك أيضًا نسخة JavaScript من هذا الدليل لأولئك الذين يستخدمون Node.js.

32 إعجابًا
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?

{“failed”:“فشل”,“message”:“خطأ في تسجيل الدخول”}