OAuth2 csrf_detected مع وظيفة 'اتصال' Discord

مرحباً! أنا في أمس الحاجة للمساعدة في فهم هذا الخطأ:


خطوات لإعادة الإنتاج:
عندما ينقر المستخدم على زر “Connect” الخاص به في Discord ضمن التفضيلات،


يتم إعادة توجيه المستخدم بشكل صحيح إلى صفحة التفويض الخاصة بـ Discord.

ولكن بعد النقر على زر التفويض، يتم إعادة توجيه المستخدم ويواجه هذه الرسالة على منتدانا:
image
ويظهر الخطأ في أعلى هذا الموضوع في سجلات المسؤول.


أشعر أنني قرأت وجربت كل شيء لإصلاح هذا، ولكنه لا يزال يحدث. لقد تأكدت من أن إعدادات موقع Discord Client ID و Secret صحيحة.
كما تأكدت من أن URI كان بالصيغة الصحيحة (بناءً على بعض المواضيع ذات الصلة التي رأيتها):

أي اقتراحات؟ أنا على استعداد لتجربة أي شيء، حتى لو لم تكن متأكدًا من أنه سيعمل :ضحك:

هل لدى أي شخص أفكار؟ ما زلت أعاني من هذا :confused:

أعتقد (؟) أنني قصرت الأمر على مشكلة nginx و/أو التخزين المؤقت؟ هل من المفترض أن يكون هناك شيء خاص بالمصادقة أو خاص بـ CSRF محدد في discourse.conf قد نكون نغفل عنه؟

@merefield، @david، @sam - آسف للإزعاج ولكنني أرى أسماءكم في العديد من المناقشات القديمة المتعلقة بـ csrf في الماضي. هل لديكم أي توصيات لهذا؟ مع كون مصادقة Discord جزءًا لا يتجزأ من discourse، أنا في حيرة من أمري بشأن ما يمكن أن يسبب هذا.

أقدر أي مساعدة مقدمة مقدمًا، شكرًا :smiling_face:

يجب أن نكون قد انتهكنا أحد هذه؟

لا زلت غير قادر على إيجاد نمط. في بعض الأحيان يعمل ويربطني بشكل صحيح، ولكن في أحيان أخرى أواجه صفحة csrf.
في الوقت الحالي، أشك في التحقق الأخير في verified_request?.
هل هناك أي طرق للتحقق بسهولة مما إذا كان (valid_request_origin? && any_authenticity_token_valid?) يُرجع true؟

أعتذر عن عدم وجود أي معلومات قابلة للتصحيح، لكن أعتقد أنني تمكنت من تحديد (على الأقل ما أعتقد أنه) المشكلة. لا أزال غير متأكد من الحل، لذا يرجى المتابعة :kissing_heart:

تُظهر الصور أدناه مثالاً متتاليًا حيث تمكنت من ربط حسابي بنجاح، وقمت بتحديث/تجربته مرة أخرى، وواجهت صفحة اكتشاف csrf بنجاح. كنت في نافذة متصفح متخفي ولم أفعل/أغير أي شيء حرفيًا بين الاتصال الناجح وفشل csrf. إليك ما وجدته:
لذلك تُظهر هذه الصورة الأولى تطابق ملف تعريف الارتباط _forum_session في رؤوس الطلبات 1 و 2، مما أدى إلى اتصال ناجح.


ولكن بعد تحديث الصفحة ومحاولة مرة أخرى (وفشل الاتصال)، يمكنك رؤية بحثي على اليسار يُظهر تكرارًا واحدًا فقط لملف تعريف الارتباط _forum_session في رأس الطلب عندما أدى إلى فشل.

باختصار: أنا متأكد من أن المشكلة تنبع من ملف تعريف الارتباط forum_session في رأس طلب discord?reconnect ثم رأس طلب callback? التالي غير المتطابق. ما الذي قد يسبب اختلافهما؟

حسناً، أعتقد أننا نقترب.

لذا في هذه الصورة أدناه، يمكنك رؤية طلب POST للتحديث يحدث مباشرة بعد طلب POST لإعادة الاتصال بـ discord.


وبالتأكيد، فإنه يقوم بتعيين ملف تعريف الارتباط _forum_session مما يتسبب في عدم تطابقه كما وصفت أعلاه.

إذا قمت بفحص مثيل اتصال ناجح (أدناه)، يمكنك رؤية أن التحديث يحدث فقط قبل طلب POST لإعادة الاتصال بـ discord.

هذا يتسبب في تطابق ملف تعريف الارتباط _forum_session وربط الحساب بنجاح دون مشكلة csrf.

كيف أمنع حدوث هذا التحديث بعد أن يبدأ المستخدم عملية الاتصال؟

@FerrariFlunker آسف على بطء الرد، لكن لم تتح لي الفرصة للنظر في هذا، سيكون رائعًا إذا تمكن الفريق الأساسي من ذلك.

إذا كان ذلك يعزيك، يمكنني تكرار المشكلة، أعتقد أنني أحصل على نفس الخطأ:

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

لا تقلق يا @merefield، أقدر ردك!

هل تواجه هذا الخطأ في بيئتك الخاصة؟ أعتقد على أي حال أن هذا الخطأ يحتاج إلى أن ينظر فيه الفريق الأساسي. لقد أمضيت أسبوعين في تصحيح هذا ولم أجد إجابة بعد :confused:

إعجاب واحد (1)

تحليل رائع! يمكن أن يتسبب هذا النوع من حالات التسابق بالتأكيد في المشكلات التي تواجهها.

ومع ذلك، لم نتلق أي تقارير أخرى عن هذه المشكلة، لذا يبدو أنها يجب أن تكون شيئًا خاصًا بموقعك/تكوينك. ما هي الإضافات المثبتة على الموقع؟ هل يمكنك فتح استدعاء “التحديث” ورؤية الحمولة التي يتم إرسالها؟

3 إعجابات

بعد إلقاء نظرة على استدعاءات التحديث، أعتقد أنك على حق. إليك بعض لقطات الشاشة لطلبات “update” المؤكدة التي تسببت في فشل csrf.

أرى نمطًا يتضمن شبكة توصيل المحتوى :face_with_monocle: ما الذي يمكن أن يكون خاطئ التكوين معه؟ أخبرني إذا كنت لا تزال بحاجة إلى قائمة بالمكونات الإضافية الخاصة بنا، فقد اعتقدت فقط أنني سأوفر هذا الرد من +1 صورة :smile:

إعجاب واحد (1)

لدي تحديث مثير! قبل بضعة أيام، ألقيت نظرة فاحصة على حمولة “التحديث” ونجحت في ربط ما يلي:

بإحدى الإضافات لدينا! :partying_face: :expressionless: :smile:
بعد تعطيل الإضافة، وإجراء المزيد من الاختبارات، وإطلاق ناجح للميزة ذات الصلة للمجتمع… أعتقد أنني أستطيع القول بثقة أننا وجدنا الجاني.

إذًا، تبين أن هذه الإضافة هي صانعة المشاكل: GitHub - discourse/discourse-chat: Chat inside Discourse

بالنظر إلى الوراء، يبدو منطقيًا لماذا كانت هذه هي المشكلة، فالإضافة لا تزال معلمة على أنها تجريبية وليست مخصصة للمواقع الإنتاجية. :sweat:

نظرًا لأنني قضيت أكثر من 3 أسابيع في تشخيص هذه المشكلة وأحتاج إلى العودة إلى المسار الصحيح مع مشاريع مجتمعنا الأخرى :face_with_spiral_eyes:، للأسف لن أتمكن من المساعدة في إيجاد حل لإضافة discourse-chat.

إذا قام شخص ما بدفع إصلاح للإضافة، فسننظر (على الأرجح :smile:) في إعادة تمكين الإضافة على موقعنا، ولكن في الوقت الحالي نحتاج إلى وظيفة ربط حسابات مستقرة.

شكرًا مرة أخرى لكل من ساعد في التشخيص! :+1:

إعجابَين (2)

شكراً على التحقيق المفصل للغاية يا @FerrariFlunker!

لقد قمت للتو بإنشاء طلب سحب لإصلاح في نواة Discourse:

السبب في إصلاحه بعد إزالة المكون الإضافي للدردشة هو أن الدردشة تستخدم واجهة برمجة تطبيقات ‘PresenceChannel’ هذه بكثافة، وبالتالي فإن المشكلة من المرجح أن تحدث. لا أعتقد أن أي تغييرات ستكون مطلوبة في الدردشة.

4 إعجابات

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

5 إعجابات

نعم، سيتم تطبيق هذا الإصلاح على جميع أنواع تسجيل الدخول المختلفة :+1:

3 إعجابات