أحاول إعداد إضافة 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 غير صالح:
Falco
(Falco)
13 نوفمبر 2019، 8:14م
8
هذا redirect_uri غير صحيح. تحتاج إلى تعيينه بشكل صحيح لكي تعمل العملية.
في توثيق الإضافة، هذا هو أول شيء في الإعداد الأساسي .
كما يوثق NeonCRM كيفية تعيينه في توثيقهم
شكرًا لك @Falco !
لقد حاولت تعيين redirect_uri إلى:
https://MY-FORUM.COM/auth/oauth2_basic/callback
لكن ذلك لم ينجح، راجع منشوري الأصلي (الذي عدّلتُه للتو ليكون أقل إرباكًا، آسف إذا لم تلاحظه).
Falco
(Falco)
13 نوفمبر 2019، 8:26م
10
هل يعمل منتداك عبر HTTPS؟
Falco
(Falco)
13 نوفمبر 2019، 8:40م
12
هل قمت بتفعيل إعداد force_https؟
@Falco ، لقد وجدت تعليمات لتمكين force_https، وقد قمت بتعيينها على true.
ومع ذلك، ما زلت أحصل على نفس الخطأ.
لقد قمت بدمج الأداة التي تقترحها NeonCRM في أعلى المنتدى (حتى تتمكن من تجربتها بنفسك إذا أردت) على الرابط التالي:
https://forum.efao.ca/
عند استخدامي للأداة، أحصل على نفس النتيجة التي وردت في منشوري الأصلي.
(oauth2_basic) فشل المصادقة! تم اكتشاف CSRF: OmniAuth::Strategies::OAuth2::CallbackError، تم اكتشاف csrf_detected | تم اكتشاف CSRF
هل هناك أحد؟ @david أو @Falco ؟
david
(David Taylor)
20 نوفمبر 2019، 8:41ص
16
المكان الوحيد الذي نستخدم فيه Excon في مكون oauth2 هو هنا:
# frozen_string_literal: true
# name: discourse-oauth2-basic
# about: Allows users to login to your forum using a basic OAuth2 provider.
# meta_topic_id: 33879
# version: 0.3
# authors: Robin Ward
# url: https://github.com/discourse/discourse-oauth2-basic
enabled_site_setting :oauth2_enabled
require_relative "lib/omniauth/strategies/oauth2_basic"
require_relative "lib/oauth2_faraday_formatter"
require_relative "lib/oauth2_basic_authenticator"
# You should use this register if you want to add custom paths to traverse the user details JSON.
# We'll store the value in the user associated account's extra attribute hash using the full path as the key.
DiscoursePluginRegistry.define_filtered_register :oauth2_basic_additional_json_paths
# After authentication, we'll use this to confirm that the registered json paths are fulfilled, or display an error.
This file has been truncated. show original
ما هي القيمة التي قمت بتعيينها لـ oauth2_user_json_url؟ أعتقد أنها فارغة. إذا كان الأمر كذلك، فيجب عليك أيضًا تعطيل oauth2_fetch_user_details حتى لا يحاول Discourse الاتصال بعنوان URL فارغ.
@david ، إنه فارغ بالفعل.
لا أعرف ما يجب تعيينه كـ oauth2_user_json_url. للأسف، نفدت حظي في محاولة الحصول على مساعدة من NeonCRM لفهم هذا الأمر من خلال دعمهم الفني.
إذا حاولت تعطيله، تظهر لي رسالة تخبرني أنني بحاجة إلى تعيين oauth2 callback user id path، ولكن كما ذكرت أعلاه، لا أعرف ما يجب أن تكون قيمته.
david
(David Taylor)
21 نوفمبر 2019، 3:56م
18
ليس لدي تثبيت لـ NeonCRM لأجرب الأمر معه، لكنني أعتقد أن تعيينه إلى access_token يجب أن ينجح. هل يمكنك تجربة ذلك؟
من الوثائق التي راسلها فالكو أعلاه:
الاستجابة
ستُرجع استجابة الخادم، في حال النجاح، صيغة JSON تحتوي على رمز الوصول الخاص بالمستخدم.
{"access_token":"101177"}
هذا رمز الوصول هو ببساطة معرف حساب المستخدم في NeonCRM.
نفس الخطأ:
(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>'
david
(David Taylor)
21 نوفمبر 2019، 4:31م
20
مثير للاهتمام… يشير تتبع المكدس إلى أن الخطأ قادم من هذا الجزء من مكتبة OAuth2. هذا يعني أن معلمة state لا يتم مطابقتها بشكل صحيح.
للتأكيد، هل هذا الخطأ من موقعك الإنتاجي؟ لقد حاولت تسجيل الدخول إليه، ومن جهتي يبدو أن state يتم تمريره بشكل صحيح.
هذا يشير إلى وجود مشكلة على جانب الخادم. كيف يتم استضافة موقعك؟ هل اتبعت الإجراء القياسي الخاص بنا؟
أيضًا @david ، ولا أعرف ما إذا كان هذا مرتبطًا، لكن لدي أيضًا هذا الإدخال المنفصل في سجلاتنا:
استثناء المهمة: SSL_connect returned=1 errno=0 state=error: فشل التحقق من الشهادة (شهادة موقعة ذاتيًا)
نستخدم Let’sEncrypt للحصول على شهادة SSL الخاصة بنا.
david
(David Taylor)
21 نوفمبر 2019، 4:32م
22
هل يحتوي ذلك الخطأ على تتبع للمكدس (backtrace) مرفق به؟
دافيد، منشور:20، موضوع:132596:
لتأكيد ذلك، هل هذه الخطأ من موقعك الإنتاجي؟ . لقد حاولت تسجيل الدخول إلى ذلك، ومن جهتي يبدو أن الحالة تُمرَّر بشكل صحيح.
هذا يشير إلى وجود مشكلة ما على جانب الخادم. كيف يتم استضافة موقعك؟ هل اتبعت الإجراء القياسي الخاص بنا؟
نعم، 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'
david
(David Taylor)
21 نوفمبر 2019، 5:10م
25
أخشى أنني لا أستطيع فعل الكثير أكثر من ذلك لتشخيص المشكلة دون الوصول إلى الخادم. لدينا العديد من المستخدمين يستخدمون مكون oauth2 الإضافي دون أي مشاكل، لذا أعتقد أن هذه يجب أن تكون مشكلة في الإعدادات في مكان ما. الشيء الوحيد الآخر الذي قد يساعد هو الترقية إلى أحدث إصدار من Discourse، بدلاً من استخدام فرع النسخة المستقرة.
ربما يتدخل شخص آخر في المجتمع، ولكن إذا لم يحدث ذلك، فقد تنجح في طلب المساعدة في قناة Marketplace