خطأ في استخدام إضافة discourse-oauth2-basic مع NeonCRM

أعتقد أنني سأبدأ بمسح Droplet الحالي وإعادة إعداده من الصفر، حيث تم إعداد هذا الحاوية (docker) قبل بضع سنوات. سأعود وأبلغكم عندما أكون قد قمت بذلك واختبرته.

يبدو أن هذا خطة جيدة. بالنسبة لمعظم المجتمعات، نوصي بالالتزام بالفروع التي تمر فيها الاختبارات افتراضيًا، لأنها تمنحك أحدث وأفضل ميزات Discourse وإصلاحات الأخطاء. لقد حدثت العديد من التغييرات في المصادقة منذ الإصدار المستقر الأخير، لذا قد تجد أن الأمور تبدأ في العمل من تلقاء نفسها.

@david، لقد خصصت وقتًا اليوم لأحاول مرة أخرى. أنا الآن أستخدم تثبيتًا جديدًا لـ Discourse (أحدث إصدار مستقر، كما اقترحت).

لقد قمت بإعداد Oauth2 باستخدام الإضافة، تمامًا كما فعلت من قبل، مع الإعدادات التالية:

معرف عميل oauth2: MY-CLIENT-ID
سر عميل oauth2: MY-CLIENT-SECRET
عنوان تفويض oauth2: https://MY-NEON-ID.z2systems.com/np/oauth/auth
عنوان الرمز المميز oauth2: https://www.z2systems.com/np/oauth/token

إذا استخدمت عنوان URL المُصاغ يدويًا، فستظهر هذه الرسالة (وهي جديدة):

انتهى وقت التفويض، أو أنك قمت بالتبديل إلى متصفح آخر. يرجى المحاولة مرة أخرى.

والخطأ المعتاد في السجلات:

(oauth2_basic) فشل المصادقة! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | تم اكتشاف CSRF

من ناحية أخرى، إذا استخدمت زر OAuth2 في نافذة تسجيل الدخول إلى Discourse، فستظهر الرسالة التالية:

أوبس

واجه البرنامج الذي يدعم منتدى النقاش هذا مشكلة غير متوقعة. نعتذر عن الإزعاج.

تم تسجيل معلومات مفصلة حول الخطأ، وتم إنشاء إشعار تلقائي. سنقوم بمراجعته.

أحصل أيضًا على الأخطاء التالية المسجلة في /logs:

ArgumentError (URI غير صالح: ) /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/excon-0.71.0/lib/excon.rb:126:in `new'

و

فشل في معالجة الاستثناء في وسيط تطبيق الاستثناء: URI غير صالح:

@david جربت اقتراحك السابق بشأن تعيين oauth2_user_json_url وتعطيل oauth2_fetch_user_details، وحصلت على مجموعة من الأخطاء (الجديدة) بعد تجربتها:

ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR: null value in column “provider_uid” violates not-null constraint
DETAIL: Failing row contains (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107).
)
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.4/lib/patches/db/pg.rb:69:in `async_exec_params’

Failed to handle exception in exception app middleware : PG::NotNullViolation: ERROR: null value in column “provider_uid” violates not-null constraint
DETAIL: Failing row contains (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107).

وبالطبع الخطأ المعتاد:

(oauth2_basic) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected

ومع ذلك، لاحظت في هذا الخطأ الأخير (CSRF Detected) أنه في تبويب env، يُذكر:

hostname forum-app
process_id 762
application_version db7d00a8dce2cc1f7b9d86192cde1f55dd57408b
HTTP_HOST forum.efao.ca

هل من الطبيعي ألا يتطابق اسم المضيف (hostname) مع اسم HTTP_HOST؟ هل يمكن أن يكون هذا هو السبب في حصولي على خطأ CSRF؟

مرحبًا دينيس،

هل حصلت على أي نتيجة؟
لقد واجهت نفس الخطأ:
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR: null value in column “provider_uid” violates not-null constraint

كيف قمت بإصلاحه؟

شكرًا لك،
بيم

عملتُ مع دينيس على استنتاج أن NeonCRM لا يلتزمون حقًا بمواصفات oauth2… فهم يرسلون user_id داخل متغير access_token، ولا يمكن استخدامه كرمز وصول فعلي.

لذلك، تحتاج إلى تعطيل oauth2_fetch_user_details، وتعيين oauth2_callback_user_id_path إلى token (وليس access_token، لأن مكتبة oauth2 بلغة Ruby تعيد تسميتها للاستخدام الداخلي)

مع ذلك، يجب أن يعمل النظام، لكن لا توجد طريقة لجلب بريد المستخدم الإلكتروني أو اسمه.

مرحبًا دينيس،

أنا أستخدم Mattermost لذا يتصرف النظام بشكل مختلف.
ومع ذلك، فقد جعلت معلوماتك أبحث أكثر في الإعدادات، وقد نجح الأمر، شكرًا لك!!

إليك إعداداتي الخاصة بـ Mattermost كمزود OAuth2 لـ Discourse:

الإعدادات كنص لمحركات البحث:

معرف عميل OAuth2: <معرف العميل من إعداد مزود OAuth2 في Mattermost>
سر عميل OAuth2: <سر العميل من إعداد مزود OAuth2 في Mattermost>
عنوان URL للتفويض OAuth2: https://chat.animalrebellion.org/oauth/authorize
عنوان URL للحصول على الرمز OAuth2: https://chat.animalrebellion.org/oauth/access_token
طريقة طلب الرمز OAuth2: POST
مسار معرف المستخدم في استدعاء OAuth2:
مسارات معلومات المستخدم في استدعاء OAuth2
جلب تفاصيل المستخدم عبر OAuth2: مُفعّل
عنوان URL لبيانات المستخدم بصيغة JSON في OAuth2: https://chat.animalrebellion.org/api/v4/users/me
طريقة طلب بيانات المستخدم JSON في OAuth2: GET
مسار معرف المستخدم في JSON: id
مسار اسم المستخدم في JSON: username
مسار الاسم في JSON: username
مسار البريد الإلكتروني في JSON: email
مسار التحقق من البريد الإلكتروني في JSON: email_verified
مسار الصورة الرمزية في JSON:
التحقق من البريد الإلكتروني عبر OAuth2: مُفعّل

على جانب Mattermost، تم تعيين عنوان URL للاستدعاء كالتالي:
https://base.animalrebellion.org/auth/oauth2_basic/callback

لا يزال لدي رغبة في معرفة كيفية دمج first_name و last_name في مسار “اسم JSON” كـ full_name، لكن يمكنني العيش باستخدام خاصية “username” أو “first_name” فقط.

أتمنى أن يكون هذا مفيدًا.

تحياتي!
Beam

روابط للموارد:
رابط الإضافة: GitHub - discourse/discourse-oauth2-basic: A basic OAuth2 plugin for use with Discourse · GitHub
رابط كيفية تثبيت إضافة Discourse: Install plugins on a self-hosted site

سعيد لأنك نجحت في تشغيلها @Beam!