هل تريد استخدام Discourse كموفر للهوية لتطبيق الويب الخاص بك؟ رائع! لنبدأ.
تفعيل إعداد موفر DiscourseConnect
ضمن إعدادات موقع المسؤول في Discourse (/admin/site_settings)، قم بتمكين الإعداد enable discourse connect provider وأضف سلسلة سرية إلى discourse connect provider secrets (تُستخدم لتجزئة حمولات SSO).
تطبيق DiscourseConnect في تطبيق الويب الخاص بك:
-
قم بإنشاء قيمة عشوائية 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: (سلسلة) معرّف مستخدم Discourseusername: (سلسلة) اسم المستخدم/المقبضname: (سلسلة) اسم المستخدم الحقيقيemail: (سلسلة) عنوان البريد الإلكترونيavatar_url: (سلسلة) رابط CDN كامل لصورة الصورة الرمزية للمستخدم التي تم تحميلهاadmin: (قيمة منطقية)trueإذا كان المستخدم مسؤولاً، وإلاfalsemoderator: (قيمة منطقية)trueإذا كان المستخدم مشرفًا، وإلاfalsegroups: (سلسلة) قائمة مفصولة بفواصل من المجموعات (حسب الاسم) التي ينتمي إليها المستخدم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 (للمسؤولين فقط): GitHub - discourse/discourse-auth-proxy: An http proxy that uses the DiscourseConnect protocol to authenticate users · GitHub (صنعه @sam)
تطبيقات المجتمع المساهمة “استخدام Discourse كموفر SSO”:
-
سكربت PHP يطبق Discourse كموفر SSO: Discourse sso provider login · GitHub (صنعه @paxmanchris)
-
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
GitHub - ArmedGuy/discourse_sso_node: npm package for Discourse SSO login features. · GitHub -
ASP.NET Core (يتطلب فقط التكوين):
GitHub - Biarity/DiscourseSso: Easy, configurable Discourse SSO: GET /auth/login -> recieve a JWT with user data · GitHub -
امتداد MediaWiki (PHP):
DiscourseSsoConsumer, a SSO extension for MediaWiki (صنعه @mdoggydog)
