يستقبل WordPress طلب DiscourseConnect ويعيد استدعاءً (callback) يحتوي على sso و sig.
يصل الاستدعاء إلى Discourse، لكن Discourse يرفضه لأن توقيع HMAC لا يتحقق.
لقد أجرينا تصحيحاً للأخطاء (Debugging) بشكل واسع إلى حد ما، وضيّقنا نطاق المشكلة بشكل كبير.
ما قمنا بتأكيده
دالة wp_unslash() لا تُغيّر قيم الاستدعاء.
مدخلات التحقق الخاصة بـ EA/WordPress تتطابق مع المعلمات المُعاد بناؤها من سلسلة الاستعلام (query string) التي رصدها WordPress.
كود الاستدعاء المتوقع يُنفَّذ بالتأكيد.
ملفات المصدر المُنفَّذة تطابق قائمة البناء (build manifest) لدينا.
لقد تحققنا من مشاكل الملفات الخاطئة أو التعريفات المكررة.
تم إعادة تشغيل PHP-FPM بعد آخر التصحيحات، لذا فإن هذا ليس بسبب عملية PHP قديمة أو حالة opcache قديمة.
طلب DiscourseConnect جديد تماماً بعد تلك التغييرات لا يزال يفشل في التحقق من HMAC.
بعبارة أخرى، الفشل الحالي قابل للتكرار على طلب جديد.
ما لم نتمكن من إثباته بعد
أن السر (secret) الفعّال الذي يستخدمه Discourse وقت التشغيل مطابق حرفياً (byte-for-byte) للسر الذي يستخدمه WordPress.
أن حمولة sso لا يتم تغييرها في مكان ما قبل النقطة التي يلاحظ فيها WordPress الطلب.
في هذه المرحلة، لا نريد الاستمرار في تغيير الإعدادات أو الكود بشكل عشوائي.
السؤال
بالنسبة لنسخ Discourse/DiscourseConnect الحالية، ما هو أفضل طريقة لتحديد بالضبط أي حمولة وسر يستخدمهما Discourse عند حساب HMAC المتوقع؟
هل توجد طريقة توصية للتصحيح/التسجيل (debugging/logging) تتيح لنا مقارنة مدخلات HMAC في جانب Discourse بمدخلات جانب WordPress دون الكشف عن السر الفعلي علناً؟
إذا كانت هناك أي مشاكل معروفة تتضمن معالجة WordPress/PHP، أو ترميز URL، أو حمولات Base64، أو الوكلاء العكسيين (reverse proxies)، أو Discourse المستضاف الذي قد يؤدي إلى هذه الحالة، فسأقدّر أي إرشادات.
يمكنني تقديم قيم طلب/استدعاء معقمة (sanitized)، وأكواد WordPress ذات الصلة، والسجلات إذا لزم الأمر.
مرحبًا ريتشارد. تم تثبيت WP-Discourse، لكن مُقدِّم DiscourseConnect ووظائف مزامنة تسجيل الدخول معطّلة.
نحن نستخدم إضافة ووردبريس مخصصة صغيرة كـ مُقدِّم DiscourseConnect. تستقبل هذه الإضافة معاملات sso وsig من Discourse، وتتحقق من HMAC الواردة باستخدام السر المشترك، ثم تُنشئ/تُوقّع الاستجابة لإرسالها مرة أخرى إلى Discourse.
الخطأ يحدث حاليًا على الطلب الوارد من Discourse إلى ووردبريس — وتشير تشخيصاتنا الجديدة إلى أن إعادة حساب HMAC لا تطابق sig المستلمة من Discourse.
يسعدني مشاركة كود PHP الخاص بالاستدعاء/التحقق ذي الصلة. سأزيل قيم الإعدادات/الأسرار قبل نشره.
نعم — أنت محق. صياغتي في المنشور الأصلي كانت معكوسة.
خطأ الفشل الحالي هو Discourse → WordPress.
يقوم Discourse بتوليد طلب DiscourseConnect الذي يحتوي على sso وsig. يستقبل WordPress هذا الطلب، ثم يحاول مزود EA المخصص لدينا التحقق من التوقيع. يفشل التحقق من HMAC الوارد، لذلك يتوقف WordPress عند هذه النقطة. ولا يصل إلى مرحلة إرجاع حمولة المستخدم الموثق إلى Discourse.
تم تثبيت WP-Discourse، لكن مزود DiscourseConnect ووظائف مزامنة تسجيل دخول المستخدمين معطلة. نحن نستخدم حاليًا مزود EA المخصص لأننا نريد إبقاء طبقة حساب/ملف EA تحت سيطرتنا.
سأقوم بنشر الكود الخاص بالcallback/التكوين/التحقق من HMAC ذي الصلة أدناه، مع إزالة جميع الأسرار والإعدادات الخاصة.