# استخدام Discourse كمزود هوية (SSO، DiscourseConnect)

**URL:** https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974
**Category:** Integrations
**Tags:** sso, discourseconnect, how-to
**Created:** [7 سبتمبر 2015، 9:19ص UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974 "2015-09-07T09:19:21Z")
**Posts on this page:** 1
**Showing post:** 1

<div class="post-metadata">

### Author: ![Discourse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/discourse/32/148734_2.png) [@Discourse](https://meta.discourse.org/u/Discourse)
#### Post date: [7 سبتمبر 2015، 9:19ص UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/1 "2015-09-07T09:19:22Z")

</div>

هل تريد استخدام Discourse كموفر للهوية لتطبيق الويب الخاص بك؟ رائع! لنبدأ.

## تفعيل إعداد موفر [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true)

ضمن إعدادات موقع المسؤول في Discourse (/admin/site\_settings)، قم بتمكين الإعداد `enable discourse connect provider` وأضف سلسلة سرية إلى `discourse connect provider secrets` (تُستخدم لتجزئة حمولات SSO).

## تطبيق [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) في تطبيق الويب الخاص بك:

- قم بإنشاء قيمة عشوائية [nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce). لنسمي هذه القيمة `NONCE`. احفظها مؤقتًا حتى تتمكن من التحقق منها باستخدام قيمة الـ nonce التي سيتم إرجاعها في الاستجابة.

- أنشئ حمولة جديدة باستخدام `NONCE` و `RETURN_URL` (حيث سيعيد Discourse توجيه المستخدم بعد التحقق). يجب أن تبدو الحمولة كما يلي: `nonce=NONCE&return_sso_url=RETURN_URL`. يجب أن يتطابق مضيف `RETURN_URL` مع نمط النطاق الذي استخدمته عند تكوين `discourse connect provider secrets`.

- قم بتشفير الحمولة الأولية أعلاه بتشفير Base64. لنسمي هذه الحمولة `BASE64_PAYLOAD`.

- قم بترميز عنوان URL لـ `BASE64_PAYLOAD` أعلاه. لنسمي هذه الحمولة `URL_ENCODED_PAYLOAD`.

- قم بإنشاء توقيع HMAC-SHA256 من `BASE64_PAYLOAD` باستخدام سر موفر SSO الخاص بك كمفتاح، ثم قم بإنشاء سلسلة سداسية عشرية بأحرف صغيرة منها. لنسمي هذا التوقيع `HEX_SIGNATURE`.

## إرسال طلب المصادقة إلى Discourse

قم بإعادة توجيه المستخدم إلى `DISCOURSE_ROOT_URL/session/sso_provider?sso=URL_ENCODED_PAYLOAD&sig=HEX_SIGNATURE`

## الحصول على استجابة من Discourse:

إذا تم تنفيذ الخطوات المذكورة أعلاه بشكل صحيح، فسيقوم Discourse بإعادة توجيه المستخدم الذي قام بتسجيل الدخول إلى `RETURN_URL` المقدم. ستحصل على معلمات سلسلة الاستعلام مع `sig` و `sso` جنبًا إلى جنب مع بعض معلومات المستخدم. اتبع الخطوات أدناه الآن:

- احسب HMAC-SHA256 لـ `sso` باستخدام سر موفر SSO كمفتاح لك.

- قم بتحويل `sig` من تمثيل السلسلة السداسية عشرية الخاصة به مرة أخرى إلى بايتات.

- تأكد من أن القيمتين السابقتين متساويتان.

- قم بفك تشفير Base64 لـ `sso`؛ ستحصل على سلسلة الاستعلام المضمنة التي تم تمريرها. ستحتوي على مفتاح يسمى `nonce` يجب أن تتطابق قيمته مع الـ nonce الذي تم تمريره في الأصل. تأكد من أن هذا هو الحال، وتأكد من حذف الـ nonce من نظامك.

- ستجد أن سلسلة الاستعلام هذه ستحتوي أيضًا على مجموعة من معلومات المستخدم. استخدمها حسب الرغبة.

هذا كل شيء. بحلول هذا الوقت، يجب أن تكون قد أعددت تطبيق الويب الخاص بك لاستخدام Discourse كموفر SSO!

## المزيد من المعلمات، والمزيد من الخيارات

بالإضافة إلى `nonce` و `return_sso_url`، تحتوي حمولة الطلب على العديد من المعلمات الاختيارية الإضافية.

- `prompt`: إذا كانت `prompt=none`، يتم التعامل مع طلب SSO كطلب “مجرد تحقق”. إذا كان المتصفح/الجهاز قد قام بتسجيل الدخول بالفعل إلى Discourse، فسيقوم Discourse بإرجاع استجابة SSO ناجحة تتضمن معلومات مصادقة المستخدم، كالمعتاد. إذا لم يكن المتصفح/الجهاز قد قام بتسجيل الدخول بالفعل، فلن يطلب Discourse من المستخدم تسجيل الدخول، وسيقوم فورًا بإرجاع استجابة SSO تتضمن المعلمة `failed=true` بدلاً من معلومات المستخدم. يوفر هذا آلية للاستعلام عما إذا كان المستخدم قد سجل الدخول، دون توجيه المستخدم أبدًا إلى مربع حوار تسجيل الدخول إذا لم يكن كذلك.

- `logout`: إذا كانت `logout=true`، يصبح طلب SSO طلب _تسجيل خروج_. إذا كان المستخدم قد سجل الدخول إلى Discourse على هذا المتصفح/الجهاز، فسيتم تسجيل خروجه من هذا الجهاز. في كلتا الحالتين، سيقوم Discourse بإعادة التوجيه فورًا إلى `return_sso_url`، _بدون_ إضافة `sso` أو `sig` إلى سلسلة الاستعلام.

- `require_2fa`: إذا كانت `require_2fa=true`، فسيطلب Discourse من المستخدم التحقق من المصادقة الثنائية قبل إعادة التوجيه. ستحتوي حمولة الاستجابة على `confirmed_2fa=true` إذا أكمل المستخدم التحقق من 2FA بنجاح، أو `no_2fa_methods=true` إذا لم يكن لدى المستخدم أي طرق 2FA مهيأة.

`prompt=none` و `logout=true` لا يمكن أن يتواجدا معًا؛ لا معنى لتقديمهما في نفس الطلب.

## مرجع حمولة `sso=`

معلمات الطلب:

- `nonce`: (سلسلة، مطلوب) سلسلة عشوائية تم إنشاؤها بشكل آمن
- `return_sso_url`: (سلسلة، مطلوب) عنوان URL لإعادة التوجيه إليه مع الاستجابة
- `prompt`: (سلسلة، اختياري) إذا كانت `none`، فقم بفحص حالة المصادقة دون مطالبة المستخدم بتسجيل الدخول.
- `logout`: (قيمة منطقية، الافتراضي `false`) إذا كانت `true`، فقم بتسجيل خروج المستخدم من Discourse.
- `require_2fa`: (قيمة منطقية، الافتراضي `false`) إذا كانت `true`، فقم بمطالبة المستخدم بالتحقق من المصادقة الثنائية قبل إعادة التوجيه.

معلمات النتيجة:

- _لا توجد حمولة `sso=`، أو توقيع، استجابةً لطلب تسجيل الخروج، فقط إعادة توجيه إلى `return_sso_url` العادي للطلب._
- حمولة النتيجة لطلب تسجيل الدخول ستحتوي دائمًا على `nonce`، المعكوس من الطلب.
- ستعكس حمولة النتيجة أيضًا أي معلمات طلب أخرى. _لا تعتمد على هذا السلوك؛ إنه ليس مقصودًا بالضرورة وليس جانبًا مضمونًا من واجهة برمجة التطبيقات._ (على سبيل المثال، لماذا يتم نسخ المعلمة `return_sso_url` إلى الحمولة التي يتم إرسالها إلى `return_sso_url`؟)
- إذا فشل الطلب في مصادقة مستخدم، فستحتوي حمولة النتيجة على `failed=true`.
- إذا نجح الطلب في مصادقة مستخدم، فستحتوي حمولة النتيجة على بيانات اعتماد/معلومات المستخدم:
  - `external_id`: (سلسلة) معرّف مستخدم Discourse
  - `username`: (سلسلة) اسم المستخدم/المقبض
  - `name`: (سلسلة) اسم المستخدم الحقيقي
  - `email`: (سلسلة) عنوان البريد الإلكتروني
  - `avatar_url`: (سلسلة) رابط CDN كامل لصورة الصورة الرمزية للمستخدم التي تم تحميلها
  - `admin`: (قيمة منطقية) `true` إذا كان المستخدم مسؤولاً، وإلا `false`
  - `moderator`: (قيمة منطقية) `true` إذا كان المستخدم مشرفًا، وإلا `false`
  - `groups`: (سلسلة) قائمة مفصولة بفواصل من المجموعات (حسب الاسم) التي ينتمي إليها المستخدم
  - `profile_background_url`: (سلسلة) رابط CDN كامل لصورة خلفية ملف تعريف المستخدم
  - `card_background_url`: (سلسلة) رابط CDN كامل لصورة خلفية البطاقة للمستخدم
  - `confirmed_2fa`: (قيمة منطقية) `true` إذا أكمل المستخدم التحقق من 2FA (موجود فقط عند طلب `require_2fa=true`)
  - `no_2fa_methods`: (قيمة منطقية) `true` إذا لم يكن لدى المستخدم أي طرق 2FA مهيأة (موجود فقط عند طلب `require_2fa=true`)

قد تكون `name` و `avatar_url` و `profile_background_url` و `card_background_url` مفقودة إذا لم يقم المستخدم بتعيينها. (سيتم حذف أي عنصر تكون قيمته `nil` داخل Discourse من الاستجابة.)

### تطبيقات Discourse الرسمية “استخدام Discourse كموفر هوية”:

- وكيل HTTP (يستخدم golang) يقوم بمصادقة المستخدمين باستخدام [Discourse SSO](https://meta.discourse.org/t/13045?silent=true) (للمسؤولين فقط): [GitHub - discourse/discourse-auth-proxy: An http proxy that uses the DiscourseConnect protocol to authenticate users · GitHub](https://github.com/discourse/discourse-auth-proxy) (صنعه @sam)

### تطبيقات المجتمع المساهمة “استخدام Discourse كموفر SSO”:

- سكربت PHP يطبق Discourse كموفر SSO: [Discourse sso provider login · GitHub](https://gist.github.com/paxmanchris/e93018a3e8fbdfced039) (صنعه @paxmanchris)

- Ruby:  
[GitHub - AstonJ/sso\_with\_discourse: Implementation in ruby for https://meta.discourse.org/t/using-discourse-as-a-sso-provider/32974 · GitHub](https://github.com/AstonJ/sso_with_discourse)

- Erlang:  
[https://github.com/reverendpaco/discourse-as-sso-erlang](https://github.com/reverendpaco/discourse-as-sso-erlang)

- Node.js:  
[GitHub - edhemphill/passport-discourse: A Passport strategy for authenticating using a Discourse forum · GitHub](https://github.com/edhemphill/passport-discourse)  
[GitHub - ArmedGuy/discourse\_sso\_node: npm package for Discourse SSO login features. · GitHub](https://github.com/ArmedGuy/discourse_sso_node)

- [ASP.NET](http://ASP.NET) Core (يتطلب فقط التكوين):  
[GitHub - Biarity/DiscourseSso: Easy, configurable Discourse SSO: GET /auth/login -\> recieve a JWT with user data · GitHub](https://github.com/Biarity/DiscourseSso)

- امتداد MediaWiki (PHP):  
[DiscourseSsoConsumer, a SSO extension for MediaWiki](https://meta.discourse.org/t/discoursessoconsumer-a-sso-extension-for-mediawiki/211445?u=mdoggydog) (صنعه @mdoggydog)

---

_[View the full topic](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974)._
