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

أحاول إعداد إضافة discourse-oauth2-basic بحيث يتمكن مستخدمونا من تسجيل الدخول إلى منتدى Discourse الخاص بنا باستخدام بيانات الاعتماد الخاصة بحساباتهم التي تم إنشاؤها وتخزينها عبر NeonCRM.

شرح لي أحد فنيي دعم NeonCRM أنه يمكنني إنشاء عنوان URL للتفويض يدويًا باستخدام هذا التنسيق:

https://{{معرف المنظمة}}.z2systems.com/np/oauth/auth?response_type=code&client_id={{معرف العميل}}&redirect_uri={{عنوان URL لإعادة التوجيه}}

في Discourse، قمت بتعيين المعاملات التالية للإضافة:

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

لذلك قمت بإنشاء عنوان URL هذا يدويًا (وقمت بإخفاء بعض أجزائه):

https://MY-NEON-ID.z2systems.com/np/oauth/auth?response_type=code&client_id=MY-CLIENT-ID&redirect_uri=https://MY-FORUM.COM/auth/oauth2_basic/callback

وعندما أدخل هذا العنوان في المتصفح، أرى صفحة Discourse تعرض الرسالة التالية:

وتشير سجلات النظام إلى ما يلي:

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

لماذا يحدث ذلك؟

لذا إذا استخدمت هذا الرابط بدلاً من ذلك:

https://MY-NEON-ID.z2systems.com/np/oauth/auth?response_type=code&client_id=MY-CLIENT-ID&redirect_uri=https://MY-FORUM.COM/

(أزلت جزء الاستدعاء في نهاية redirect_uri الخاص بي)

أتمكن فعليًا من الوصول إلى صفحة تسجيل الدخول إلى NeonCRM، وبعد ذلك أدخل بيانات اعتماد المستخدم التجريبي الخاصة بي وأقوم بتسجيل الدخول. ثم يتم إعادة توجيهي إلى MY-FORUM.COM. ولكن بمجرد وصولي إلى هناك، لم أقم بتسجيل الدخول على الإطلاق. إذا نقرت على زر “تسجيل الدخول” في أعلى الصفحة ثم نقرت على الزر الرمادي “تسجيل الدخول باستخدام OAuth2”، فإن نافذة جديدة تفتح مع الرسالة التالية:

ويظهر خطأان في سجلاتي:

ArgumentError (URI غير صالح: )

/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/excon-0.64.0/lib/excon.rb:126:in `new’

و

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

هذا redirect_uri غير صحيح. تحتاج إلى تعيينه بشكل صحيح لكي تعمل العملية.

في توثيق الإضافة، هذا هو أول شيء في الإعداد الأساسي.

كما يوثق NeonCRM كيفية تعيينه في توثيقهم

شكرًا لك @Falco!

لقد حاولت تعيين redirect_uri إلى:

https://MY-FORUM.COM/auth/oauth2_basic/callback

لكن ذلك لم ينجح، راجع منشوري الأصلي (الذي عدّلتُه للتو ليكون أقل إرباكًا، آسف إذا لم تلاحظه).

هل يعمل منتداك عبر HTTPS؟

نعم، إنه @Falco.

https://forum.efao.ca/

هل قمت بتفعيل إعداد force_https؟

@Falco، لقد وجدت تعليمات لتمكين force_https، وقد قمت بتعيينها على true.

ومع ذلك، ما زلت أحصل على نفس الخطأ.

لقد قمت بدمج الأداة التي تقترحها NeonCRM في أعلى المنتدى (حتى تتمكن من تجربتها بنفسك إذا أردت) على الرابط التالي:

https://forum.efao.ca/

عند استخدامي للأداة، أحصل على نفس النتيجة التي وردت في منشوري الأصلي.

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

هل هناك أحد؟ @david أو @Falco؟

المكان الوحيد الذي نستخدم فيه Excon في مكون oauth2 هو هنا:

ما هي القيمة التي قمت بتعيينها لـ oauth2_user_json_url؟ أعتقد أنها فارغة. إذا كان الأمر كذلك، فيجب عليك أيضًا تعطيل oauth2_fetch_user_details حتى لا يحاول Discourse الاتصال بعنوان URL فارغ.

@david، إنه فارغ بالفعل.

لا أعرف ما يجب تعيينه كـ oauth2_user_json_url. للأسف، نفدت حظي في محاولة الحصول على مساعدة من NeonCRM لفهم هذا الأمر من خلال دعمهم الفني.

إذا حاولت تعطيله، تظهر لي رسالة تخبرني أنني بحاجة إلى تعيين oauth2 callback user id path، ولكن كما ذكرت أعلاه، لا أعرف ما يجب أن تكون قيمته.

ليس لدي تثبيت لـ NeonCRM لأجرب الأمر معه، لكنني أعتقد أن تعيينه إلى access_token يجب أن ينجح. هل يمكنك تجربة ذلك؟

من الوثائق التي راسلها فالكو أعلاه:

نفس الخطأ:

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

التتبع الخلفي:

 /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.3.2/lib/logster/logger.rb:110:in `report_to_store'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.3.2/lib/logster/logger.rb:101:in `add_with_opts'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.3.2/lib/logster/logger.rb:52:in `add'
/usr/local/lib/ruby/2.6.0/logger.rb:543:in `error'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:163:in `log'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:486:in `fail!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-oauth2-1.6.0/lib/omniauth/strategies/oauth2.rb:71:in `callback_phase'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:238:in `callback_call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:189:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/builder.rb:64:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:30:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/tempfile_reaper.rb:15:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/conditional_get.rb:25:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/head.rb:12:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:218:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:232:in `context'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:226:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/cookies.rb:670:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:98:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/debug_exceptions.rb:61:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.3.2/lib/logster/middleware/reporter.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/rack/logger.rb:38:in `call_app'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/rack/logger.rb:28:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:18:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:31:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/request_id.rb:27:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/method_override.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/middleware/executor.rb:14:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/sendfile.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.0/lib/mini_profiler/profiler.rb:184:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/message_bus-2.2.0/lib/message_bus/rack/middleware.rb:57:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:163:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/engine.rb:524:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:68:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:605:in `process_client'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:700:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:548:in `spawn_missing_workers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:144:in `start'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `<main>'

مثير للاهتمام… يشير تتبع المكدس إلى أن الخطأ قادم من هذا الجزء من مكتبة OAuth2. هذا يعني أن معلمة state لا يتم مطابقتها بشكل صحيح.

للتأكيد، هل هذا الخطأ من موقعك الإنتاجي؟ لقد حاولت تسجيل الدخول إليه، ومن جهتي يبدو أن state يتم تمريره بشكل صحيح.

هذا يشير إلى وجود مشكلة على جانب الخادم. كيف يتم استضافة موقعك؟ هل اتبعت الإجراء القياسي الخاص بنا؟

أيضًا @david، ولا أعرف ما إذا كان هذا مرتبطًا، لكن لدي أيضًا هذا الإدخال المنفصل في سجلاتنا:

استثناء المهمة: SSL_connect returned=1 errno=0 state=error: فشل التحقق من الشهادة (شهادة موقعة ذاتيًا)

نستخدم Let’sEncrypt للحصول على شهادة SSL الخاصة بنا.

هل يحتوي ذلك الخطأ على تتبع للمكدس (backtrace) مرفق به؟

نعم، forum.efao.ca هو موقعنا الإنتاجي. نحن مستضافون على Digital Ocean وتمت التثبيت باستخدام الإجراء القياسي.

/usr/local/lib/ruby/2.6.0/net/protocol.rb:44:in `connect_nonblock'
/usr/local/lib/ruby/2.6.0/net/protocol.rb:44:in `ssl_socket_connect'
/usr/local/lib/ruby/2.6.0/net/pop.rb:553:in `do_start'
/usr/local/lib/ruby/2.6.0/net/pop.rb:531:in `start'
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:43:in `poll_pop3'
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:18:in `execute'
/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.0.7/lib/rails_multisite/connection_management.rb:63:in `with_connection'
/var/www/discourse/app/jobs/base.rb:221:in `block in perform'
/var/www/discourse/app/jobs/base.rb:217:in `each'
/var/www/discourse/app/jobs/base.rb:217:in `perform'
/var/www/discourse/app/jobs/base.rb:279:in `perform'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mini_scheduler-0.11.0/lib/mini_scheduler/manager.rb:83:in `process_queue'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mini_scheduler-0.11.0/lib/mini_scheduler/manager.rb:34:in `block in initialize'

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

ربما يتدخل شخص آخر في المجتمع، ولكن إذا لم يحدث ذلك، فقد تنجح في طلب المساعدة في قناة Marketplace