بعد اتباع الدليل https://meta.discourse.org/t/discourseconnect-official-single-sign-on-for-discourse-sso/13045، قمت بتفعيل نظام تسجيل الدخول الموحد (SSO) الخاص بـ Discourse لمشاركة تسجيل الدخول مع تطبيق RoR الحالي، لكنني أحصل على رسالة خطأ: “Error ArgumentError in DiscourseSsoController#sso, wrong number of arguments (given 1, expected 0)” بعد إعادة التوجيه إلى موقعي وإتمام عملية تسجيل الدخول.
بالنظر إلى لقطة الشاشة، يبدو أن هذا الخطأ قادم من تطبيق Rails المخصص لديك، وليس من Discourse. هل هذا صحيح؟ لا أعتقد أن Discourse يحتوي على طريقة DiscourseSsoController#sso، كما أن تتبع الاستدعاء لا يشبه تتبع استدعاء Discourse.
كيف قمت بتنفيذ هذه الطريقة في تطبيق Rails الخاص بك؟ هل قمت باستيراد بعض أجزاء الكود من قاعدة كود Discourse؟ إذا كان الأمر كذلك، فقد تتأثر عمليات الاستيراد هذه بالتغيير التالي: SECURITY: Attach DiscourseConnect (SSO) nonce to current session (#12… · discourse/discourse@13d2a1f · GitHub
هذه الفئة موجودة في تطبيقي، لكنها كود رسمي من Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) قمت بإضافته إلى تطبيقي لإدارة تسجيل الدخول الموحد (SSO)
كما اتبعت أيضًا https://stackoverflow.com/questions/25478510/incorporating-discourse-sso-with-existing-rails-site-with-devise
أرى، إذن لقد نسخت محتوى single_sign_on.rb؟ أعتقد أننا قد نحتاج إلى تحديث التوثيق هنا. هل يمكنك تجربة إضافة دالة جديدة داخل فئة SingleSignOn في ملف single_sign_on.rb الخاص بك؟
def initialize(**kwargs)
end
أعتقد أن هذا سيحل الخطأ الذي تواجهه.
هل يمكنك أيضًا تأكيد إصدار Ruby الذي تستخدمه؟
هل قمت بإعادة تشغيل الخادم؟ لا أستطيع تخيل سبب رفع خطأ في سطر end، لذا أشك في أن الكود المُشغّل لا يتطابق مع ما هو موجود في نظام الملفات؟
قد يكون ذلك جزءًا من المشكلة. فكل كود Discourse مكتوب لـ 2.7 وما فوق.
عذراً، الخطأ مني، لم أقم بإعادة تشغيل الخادم، حيث لم ألاحظ أن التعديل كان في ملف المُهيئ.
مع استخدام Devise مع CanCanCan، كان عليّ أيضاً القيام بالتالي: التعليق على before_action وإضافة skip_authorization_check:
class DiscourseSsoController < ApplicationController
skip_authorization_check
#before_action :authenticate_user! # يضمن أن يجب على المستخدم تسجيل الدخول
حسنًا، واجهتُ هذا الأمر بنفسي للتو.
يبدو أن التطبيق المرجعي يستخدم ميزة تعمل على الإصدار 2.7 وما بعده، وهي إنشاء كائن باستخدام مرجع لجدول هاش فارغ.
args = {}
class A; end
A.new(**args) #=> يعمل فقط إذا كان ruby >= 2.7
حتى في الإصدار ruby >= 2.7، سيرفع الكود المرجعي (lib/single_sign_on.rb) خطأً إذا قمت بتمرير جدول هاش عند استدعاء #parse، لأن السطر 65 في lib/single_sign_on.rb يستدعي sso = new(**init_kwargs)، بينما تم تعريف #initialize(secure_session:) في السطر 28 من app/models/discourse_single_sign_on.rb، رغم أن DiscourseSingleSignOn ترث من SingleSignOn.
هذا لن يفيد الأشخاص الذين يستخدمون هذا الكود ويعملون إما على ruby < 2.7 في مشروعهم أو يمررون بعض المعلمات المسماة (kwargs).
لذلك، نعم، أعتقد كحد أدنى أن SingleSignOn يجب أن تطبق def initialize(**kwargs);end.
@david الرابط لـ is broken single_sign_on.rb
لقد قمت بتحديثه ليكون رابطًا دائمًا. المكافئ الحديث هو discourse_connect_base.rb
شكراً لك! ولكن، كيف يمكنني تعيين المستخدم الخاص بي كمسؤول بعد تسجيل الدخول باستخدام SSO؟
يرجى فتح موضوع #دعم جديد يتضمن معلومات حول ما جربته حتى الآن، وما كانت النتيجة.

