مرحبًا. أنا جديد تمامًا في Discourse. لدي تطبيق يعمل على AWS ويستخدم Cognito للمصادقة. أرغب في ربط هذا التطبيق بمنتدى Discourse المضيف الجديد. لقد بدأت بشكل جيد، لكن آمل أن يتمكن شخص ما من تقديم إرشادات حول الخطوات النهائية للقيام بذلك.
الهدف هو جعل تجربة تسجيل الدخول سلسة بين تطبيقي ومنتدى Discourse. لذا:
إذا كان المستخدم مسجلًا الدخول في تطبيقي، فعندما يذهب إلى منتدى Discourse، يتعرف عليه Discourse ولا يطلب منه تسجيل الدخول مجددًا.
وبالمثل، إذا ذهب المستخدم أولاً إلى منتدى Discourse ولم يكن مسجلًا الدخول، فسيقوم Discourse بإعادة توجيهه إلى صفحة تسجيل الدخول الخاصة بتطبيقي (أو واجهة مستخدم مستضافة لتسجيل الدخول إذا لزم الأمر).
يبدو أن إضافة مصادقة OpenID Connect مصممة جيدًا لهذا الغرض. لقد اشتركت في خطة الأعمال مع Discourse للتأكد من قدرتي على استخدام هذه الإضافة.
لقد مررت بالتعليمات التي قدمها @david وقمت بما أعتقد أنه الإعداد على جانب Cognito:
من Cognito، حصلت على “مستند اكتشاف OpenID Connect” و “معرف عميل OpenID Connect”.
في إعدادات Discourse الخاصة بي، تحت openId_Connect، أضفت هذه القيم وحفظتها.
قمت بتفعيل “تمكين مصادقة OpenID Connect”، وفي نطاق التفويض OpenID Connect، أدخلت “openid email”. وقد حفظت هذه الإعدادات.
وفقًا لوصف الإضافة، يجب أن يكون هذا كافيًا للعمل، أليس كذلك؟
حسنًا، عندما أسجل الدخول إلى تطبيقي، ثم أذهب إلى منتداي، لا يحدث شيء. تظهر ببساطة الصفحة الرئيسية العادية مع وجود أزرار “التسجيل” و"تسجيل الدخول". آمل أن يقوم بتسجيل دخولي تلقائيًا بعد التحقق من Cognito، لكنه لا يفعل ذلك. ماذا علي أن أفعل بعد ذلك؟
بالإضافة إلى ذلك، إذا كان المستخدم يأتي إلى موقع المنتدى حديثًا (دون تسجيل الدخول إلى تطبيقي أبدًا)، فلا ينبغي أن يرى أزرار التسجيل وتسجيل الدخول في Discourse، بل يجب أن يرى زرًا ينقر عليه ليعيد توجيهه إلى صفحة تسجيل الدخول الخاصة بتطبيقي. كيف أضيف هذا؟
وأخيرًا، يشترك المستخدمون في تطبيقي ويدفعون لاستخدام الميزات المتميزة. يتم حفظ هذا كسمات مخصصة للمستخدم في Cognito (هناك سمة مخصصة تقول “مشترك” أو “غير مشترك”). فقط المستخدمون المشتركون يجب أن يتمكنوا من النشر في المنتدى. لذا، عندما يتحقق Discourse من Cognito للحصول على معلومات المستخدم، يجب أن يتحقق من السمة المخصصة للمستخدم، ولا يمنحهم القدرة على النشر إلا إذا كان المستخدم مشتركًا. كيف أفعل ذلك؟
بما أنني جديد جدًا في Discourse، سأقدر جدًا أي معلومات يمتلكها أي شخص حول أي من هذه الأسئلة. شكرًا!
أين يوجد إعداد الموقع “login_required” هذا؟ هل تقصد بـ “خاص” أن المستخدمين لا يمكنهم عرض محتوى الموقع إلا إذا كانوا مسجلين دخولًا؟ من الواضح أن هذا ليس ما أريده هنا. أريد أن يكون الأمر بحيث يجب أن يكون المستخدم مسجّل دخولًا للنشر فقط، والطريقة الوحيدة لتسجيل الدخول هي من خلال تطبيقي المنفصل.
أفترض أنك تقصد في الإعدادات → تسجيل الدخول → تمكين تسجيل الدخول المحلي (إلغاء تحديد هذا الخيار). لذا، قمت بإلغاء تحديد جميع خيارات تسجيل الدخول المحلي. ولكن ما الذي يجب أن أتحقق منه هنا؟ على سبيل المثال، إذا كنت أستخدم الإضافة لربط تطبيقي المنفصل لتسجيل الدخول، فهل هذا التطبيق المنفصل يعتبر “SSO” أم “OAuth2”؟ (أتساءل مثلاً عما إذا كان يجب أن أختار “SSO يتجاوز البريد الإلكتروني” أو “OAuth2 يتجاوز البريد الإلكتروني”؟
بخصوص السماح فقط للمستخدمين المدفوعين بالنشر:
هذا مطلب أساسي، لذا ربما سأضطر إلى إبداع حل. هل هناك خيار آخر غير إضافة SSO؟ إذا لم يكن هناك خيار، فلا يزال بإمكانني رؤية نجاح هذا الأمر إذا كان أحد الخيارات التالية ممكنًا:
أن يحتوي Discourse على مستويات مختلفة لأذونات المستخدمين. بحيث يمكنني جعل المستخدم مسجّل دخولًا، لكن دون أن يكون لديه إذن للنشر أو الرد على المنشورات. في هذه الحالة، سأحتاج إلى تحديد مستوى أذونات المستخدم بناءً على المعلومات التي يحصل عليها Discourse من Cognito (سواء كان مشتركًا أم لا).
إذا لم ينجح ذلك، فهل يحتوي Discourse على إضافة Stripe تعمل بشكل صحيح، تسمح للمستخدمين بتسجيل الدخول، لكن فقط يكونون قادرين على النشر إذا كانوا قد دفعوا عبر نظام Stripe؟
إذا لم ينجح أي من هذين الخيارين - على سبيل المثال، إذا لم يكن Discourse قادرًا على التمييز بين مستويات امتيازات المستخدمين التي يمكنني تحديدها - فسيبدو لي أنني سأحتاج إلى جعل المستخدم إما مسجّل دخولًا أو غير ذلك، بحيث يمكن للمستخدمين المسجلين دخولًا فقط النشر. هل يبدو هذا صحيحًا؟
إذا كان الأمر كذلك، فسأضطر إلى معرفة كيفية إخبار Discourse من جانب تطبيقي الخاص بتسجيل دخول المستخدم إلى Discourse فقط إذا كان قد دفع في تطبيقي.
في هذه الحالة، لا يتم دعم تسجيل الدخول التلقائي حاليًا. سيتعين على المستخدمين النقر على زر تسجيل الدخول.
حسناً، إذن يجب أن يربط زر تسجيل الدخول الآن مباشرة بمزود الهوية الخاص بك. هل يعمل ذلك؟
نعم، يمكنك إعداد جميع فئاتك بحيث يمكن للجميع القراءة. ولكن فقط المستخدمين الموجودين في مجموعة معينة يمكنهم إنشاء الموضوعات أو الرد عليها. إذا كنت ترغب في أتمتة ذلك، يمكنك استخدام واجهة برمجة التطبيقات (API) لإضافة أشخاص إلى مجموعة أو إزالتهم منها.
يمكن للجميع قراءة محتوى الموقع (سواء كانوا مسجلين الدخول أم لا).
يمكن للمستخدمين المسجلين فقط النشر.
إذا كنت مسجلًا في تطبيقي، فعند الانتقال إلى Discourse، يتواصل مع Cognito ويسجلك تلقائيًا في الدخول، مما يتيح لك النشر.
هل تقصد أن النقطة (3) غير ممكنة؟ هل تقصد أنه لسبب ما، يحدث تسجيل الدخول التلقائي فقط إذا كان محتوى الموقع مخفيًا عن الجمهور؟
يبدو أن هذا ما أريد فعله. بناءً على قولك “استخدم واجهة برمجة التطبيقات (API)”، أفترض أنك تقصد شيئًا مثل:
يحاول المستخدم تسجيل الدخول إلى منتداي.
يتم إعادة توجيهه لتسجيل الدخول إلى تطبيقي.
عند تسجيل الدخول إلى تطبيقي، يتحقق التطبيق مما إذا كان المستخدم قد دفع رسوم الاشتراك أم لا. إذا كان قد دفع، يقوم التطبيق باتصال بـ Discourse API لإضافة هذا الشخص إلى “المجموعة” التي يمكنها النشر والرد.
هل هذا ما تقصده؟ إذا كان الأمر كذلك، هل هناك وثيقة أساسية لفهم كيفية إضافة الأشخاص إلى المجموعات عبر الـ API؟
أعتقد أننا ربما لدينا تعريفات مختلفة لـ ‘تسجيل الدخول التلقائي’.
يمكن لـ Discourse الاتصال بمزود OIDC لتسجيل الدخول. تبدأ هذه العملية عندما يضغط المستخدم على زر ‘تسجيل الدخول’ في المنتدى. وهذا يعمل دائمًا، بغض النظر عن الإعدادات.
إذا كان الموقع يتطلب تسجيل الدخول (أي تم تمكين إعداد ‘تسجيل الدخول مطلوب’)، فسيتم إعادة توجيه المستخدم مباشرة إلى شاشة تسجيل الدخول الخاصة بـ OIDC دون الحاجة إلى الضغط على الزر.
نعم، هذا ما كنت أفكر فيه. إليك بعض الوثائق حول نقطة نهاية واجهة برمجة التطبيقات هذه.
ممتاز. شكرًا لك! سأراجع وثائق واجهة برمجة التطبيقات (API) هذه. يبدو أنها واعدة جدًا.
بخصوص مسألة “تسجيل الدخول التلقائي”، يبدو أنك تقصد بـ “تسجيل الدخول التلقائي” إرسال المستخدم تلقائيًا إلى شاشة تسجيل الدخول. إذن، ما تقوله هو أنه عندما يذهب المستخدم إلى منتدى Discourse الخاص بي، هناك خياران:
الخيار الأول: يقوم الموقع “تلقائيًا” بإرسالهم إلى تطبيق تسجيل الدخول المنفصل. يحدث هذا سواء كان المستخدم مسجل الدخول إلى تطبيقي أم لا. (هذا ما تصفه بـ “تسجيل الدخول التلقائي”، وتقول إن هذا يحدث إذا قمت بتعيين “login_required”).
الخيار الثاني: لا يقوم الموقع بأي إعادة توجيه تلقائية. بل يوجد زر تسجيل دخول أساسي في الصفحة. إذا ضغط المستخدم على هذا الزر، أو حاول النشر، فسيقوم المنتدى بإعادة توجيهه إلى تسجيل الدخول الخاص بتطبيقي.
كنت أتمنى وجود خيار ثالث: إذا كان المستخدم مسجل الدخول إلى تطبيقي، فعندما يذهب إلى منتدى Discourse الخاص بي، يتحقق منتدى Discourse من Cognito لمعرفة ما إذا كان المستخدم مسجل الدخول أم لا. إذا كان مسجل الدخول في Cognito، فإن Discourse يسجل دخوله في المنتدى دون الحاجة إلى أن يسجل المستخدم دخوله مرة أخرى بشكل منفصل.
أنا جديد في مجال OpenID، لكنني كنت متأكدًا تمامًا من أن هذا ممكن، لأنه إذا اضطر المستخدم لتسجيل دخوله بشكل منفصل في التطبيق وفي المنتدى عند التبديل بينهما، فإن هذه ليست تجربة سلسة.
أليس هناك طريقة لمنتدى Discourse للتحقق من Cognito، وتعديل حالة تسجيل دخول المستخدم دون الحاجة إلى أن يمر المستخدم بعملية تسجيل دخول منفصلة؟
بالمناسبة، أفترض أن دمج Discourse مباشرة في تطبيقي لن يساعد. سأفعل ذلك إذا أمكن، لكن يبدو أن هذا ممكن فقط باستخدام إطارات مضمنة (iframes)، وهذا لن يحل مشكلة المصادقة.
حسناً. لقد سمعت أن هناك طريقتين لربط Discourse بمزود مصادقة منفصل مثل Cognito: إما باستخدام إضافة OpenId، أو باستخدام تسجيل الدخول الموحد الخاص بـ Discourse.
لست على دراية مطلقاً بعملية تسجيل الدخول الموحد، ولكن هل يمكن أن تكون هذه الطريقة مناسبة لتحقيق ما أريده—تجنب تسجيل دخول المستخدمين مرتين؟
أو ربما ببساطة، عند تسجيل دخولهم إلى تطبيقي، إرسال طلب API إلى Discourse وتسجيل دخولهم بهذه الطريقة؟
(المستند الذي ربطت به يتحدث أيضاً عن تحديد عضوية المجموعات—أفترض أن هذا سيحقق ما أريده من حيث السماح فقط للمستخدمين الدافعين بالانضمام إلى المجموعة المسموح لها بالنشر)