عميل WordPress DiscourseConnect - nonce منتهية الصلاحية

لقد واجهت نفس المشكلة وهي تحدث عند تسجيل الدخول باستخدام Google. قبل WordPress، كنا نستخدم Nginx كوكيل عكسي. هل يمكن أن يكون هذا مرتبطًا؟

أفترض أن هذا يحدث عند تسجيل الدخول إلى ووردبريس عبر موقع Discourse الخاص بك. إذا كان الأمر كذلك، فإن المشكلة هي أن الـ nonce الذي تم إنشاؤه بواسطة ووردبريس قد انتهت صلاحيته. يحدث هذا في مواقع ووردبريس التي تم تمكين التخزين المؤقت للكائنات (Object Caching) فيها.

أحد الحلول هو تعطيل التخزين المؤقت للكائنات (Object Cache) في أي صفحات تحتوي على رابط “تسجيل الدخول باستخدام Discourse”. لهذا النهج، تأكد من تعطيل التخزين المؤقت للكائنات (Object Cache) للمستخدمين المجهولين.

حل آخر موضح هنا: Wordpress SSO Expired nonce - #15 by simon. يمكن نسخ الدالة في هذا المنشور بالضبط كما هي في ملف functions.php الخاص بسِمَة ووردبريس الخاصة بك.

تضيف هذه الدالة سلسلة عشوائية إلى عنوان URL لتسجيل الدخول باستخدام Discourse. تؤدي السلسلة العشوائية إلى قيام ووردبريس بكسر ذاكرة التخزين المؤقت وإنشاء nonce جديد للمستخدم. @angus، ربما يجب إضافة هذا إلى كود المكون الإضافي: wp-discourse/lib/sso-client/sso-client-base.php at main · discourse/wp-discourse · GitHub. لا توجد سلبيات لذلك، ولا أعتقد أن هناك طريقة أخرى للتعامل مع التخزين المؤقت للكائنات الذي يتسبب في استخدام nonces قديمة بدلاً من إنشاء nonces جديدة لكل زيارة.

3 إعجابات

شكراً جزيلاً على الرد. بمجرد إطلاق Discourse في التشغيل الفعلي، سنحاول تعطيل ذاكرة التخزين المؤقت لـ Nging على موقع WordPress وإذا لم ينجح ذلك، فسنقوم بتحرير ملف functions.php وفقًا للتعليمات.

شكراً @simon!

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

ولكن إذا كان الأمر كذلك، فقد نحتاج إلى تعديل مختلف قليلاً. ولكن ربما فاتني شيء ما؟

المشكلة ليست مع ذاكرة التخزين المؤقت لكائنات ووردبريس، على حد علمي فهي ليست دائمة عبر الطلبات. تحدث المشكلة مع المواقع التي لديها نوع من التخزين المؤقت الدائم: https://developer.wordpress.org/reference/classes/wp_object_cache/#persistent-caching. يمكن تكوين هذا من خلال إضافة، ولكنه ممكّن أيضًا افتراضيًا من قبل بعض مزودي الاستضافة، على سبيل المثال WP Engine. أعتقد أنه بالنسبة لحالة WP Engine، فإنهم لا يمكّنون ذاكرة التخزين المؤقت للكائنات على صفحة تسجيل الدخول الخاصة بهم، لكنهم يمكّنونها للمستخدمين المجهولين على جميع الصفحات الأخرى. لذا في WP Engine، يتم تشغيل المشكلة فقط إذا تم إضافة رابط “تسجيل الدخول باستخدام Discourse” إلى صفحة غير صفحة تسجيل الدخول.

المشكلة مع discourse_sso_url هي أنه عندما يتم تعيينه دائمًا على نفس القيمة، بالنسبة للمواقع التي تم تمكين التخزين المؤقت الدائم لها، فإنه سيعيد دائمًا نفس قيمة nonce. تعيين قيمة discourse_sso الخاصة به إلى سلسلة عشوائية، بدلاً من تعيينها على قيمتها الافتراضية 1 يكسر ذاكرة التخزين المؤقت. على الأقل لقد نجح الأمر دائمًا بهذه الطريقة عندما اختبرته سابقًا. ليس لدي إعدادات لاختباره في الوقت الحالي.

تعديل: هناك بعض التفاصيل الإضافية حول المشكلة هنا: Discourse (as provider) + WP SSO nonce error - #14 by simon. لقد مر وقت طويل منذ أن نظرت في هذا. بدا أن الحل للمشكلة في ذلك الوقت هو إضافة سلسلة عشوائية إلى discourse_sso_url و التأكد من عدم تمكين التخزين المؤقت للصفحة على الصفحة التي تم عرض رابط تسجيل الدخول عليها (وإلا، فلن تكون السلسلة العشوائية فريدة لكل زيارة من قبل مستخدم مجهول.)

حسناً. شكراً على الشرح.

أعتقد أنه يجب علينا أن نأخذ هذا الأمر خطوة بخطوة، حيث أنني قلق بشأن تطبيق إصلاح هنا دون التأكد من أنه سيكون “متعدد الأوجه”، أي أنه سيعمل مع أساليب التخزين المؤقت المختلفة.

لا يزال دور ذاكرات التخزين المؤقت المختلفة في التسبب في هذه المشكلة المحددة غير واضح بالنسبة لي، خاصة الأدوار المختلفة لذاكرة التخزين المؤقت للكائنات المستمرة وذاكرة التخزين المؤقت للصفحات (إذا كانت موجودة). يمكنني أن أفهم لماذا قد تسبب ذاكرة التخزين المؤقت للصفحات هذه المشكلة، ولكن ليس ذاكرة التخزين المؤقت للكائنات المستمرة (حتى الآن). إذا كان الأمر يتعلق بالأخيرة، فقد نرغب في تعديل الاستعلامات في فئة Nonce الخاصة بنا بدلاً من ذلك.

سأحتاج إلى اختبار هذا بعمق أكبر الأسبوع المقبل.

@Petr_Mišák هل يمكنك من فضلك محاولة تعطيل أي ذاكرة تخزين مؤقت للصفحات لديك على الصفحة التي تحتوي على رابط تسجيل الدخول أولاً وإخبارنا كيف سارت الأمور معك؟

سأحاول تعطيل Nginx Microcache الخاص بنا لصفحة تسجيل دخول تجريبية على WordPress. صفحتنا التجريبية حيث نسجل الدخول إلى WordPress من خلال Discourse موجودة هنا Test Discourse Login | Svět Androida

لقد لاحظت (من حين لآخر) المشكلة إذا استخدمت تسجيل الدخول عبر Google.

ولكن الآن أنا متفاجئ من أن روابط تسجيل الدخول إلى Discourse التي وضعناها على الصفحة باستخدام الرمز المختصر قد اختفت من صفحتنا التجريبية.

هل لدى أي شخص فكرة عن سبب حدوث ذلك؟

حتى أحل المشكلة المتعلقة بصفحة تسجيل الدخول التجريبية، ليس لدي أي “رمز غير صالح” لاختباره.

يرجى التأكد أولاً من عدم وجود مشكلة في التخزين المؤقت. أخبرنا كيف تسير الأمور معك.

أنا أفهم، سنقوم بحلها خطوة بخطوة، وأنا موافق.

يبدو أن الخطأ يحدث أيضًا مع تسجيل الدخول الرسمي. إليك بريد إلكتروني لمحاكاته حتى تتمكن من تجربته بنفسك.

  1. انتقل إلى الصفحة Přihlásit se ‹ Svět Androida — WordPress
  2. قم بتسجيل الدخول باستخدام “تسجيل الدخول باستخدام Discourse” واستخدم حساب Google الخاص بك هناك
  3. بعد تسجيل الدخول إلى Discourse، سيتم إعادة توجيهك مرة أخرى إلى https://www.svetandroida.cz/ أو https://www.svetandroida.cz/wp-login.php مع رسالة خطأ، انظر لقطة الشاشة.

تم اختباره بشكل سيء لأن المشكلة لا تظهر دائمًا.
يرجى المحاولة وإخباري إذا واجهت الخطأ قبل تعطيل ذاكرة التخزين المؤقت لـ Nginx. شكرًا

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

لقد تحققت من حالة Nginx Microcache الخاص بنا على SvětAndroida.cz - nejlepší recenze, novinky, testy a návody ولكن يبدو أن Nginx Microcache لا يُستخدم هناك على الإطلاق. لذلك، ستكون مشكلة “انتهاء صلاحية nonce” متعلقة بشيء آخر.

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

مرحباً @Petr_Mišák، هل تمكنت من العثور على الجاني لهذا؟

لقد بحثنا ولكن حتى الآن، للأسف، دون جدوى. لكننا سنواصل البحث والبحث عن سبب المشكلة.

أنا متأكد تمامًا من أن مشكلة تسجيل الدخول إلى https://www.svetandroida.cz/ عبر Discourse مرتبطة بتخزين الـ nonce مؤقتًا. الطريقة التي اختبرت بها ذلك كانت عن طريق النقر على رابط “تسجيل الدخول باستخدام Discourse” (https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F).

في المرة الأولى التي قمت فيها بذلك، تم توجيهي إلى https://komunita.svetandroida.cz/، وقمت بإنشاء حساب على موقع Discourse باستخدام Gmail، ثم تم توجيهي مرة أخرى إلى موقع WordPress الخاص بك كمستخدم مسجل الدخول.

بعد ذلك، قمت بتسجيل الخروج من موقع WordPress الخاص بك وحاولت تسجيل الدخول مرة أخرى عن طريق النقر على رابط “تسجيل الدخول باستخدام Discourse”. هذه المرة حصلت على خطأ “nonce منتهي الصلاحية”.

بعد ذلك، قمت بإنشاء رابط تسجيل دخول بقيمة عشوائية لمعامل عنوان URL discourse_sso، على سبيل المثال https://www.svetandroida.cz/?discourse_sso=181253058&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F وتمكنت من تسجيل الدخول إلى موقع WordPress الخاص بك عبر Discourse دون أي مشاكل.

لقد جربت هذا عدة مرات، سواء مع رابط تسجيل الدخول الذي تم إنشاؤه بواسطة المكون الإضافي (https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F) ومع روابط تسجيل الدخول التي تم تعيين قيمة عشوائية لها لمعامل discourse_sso. يبدو أن الـ nonce الذي يتم إرجاعه يتم تخزينه مؤقتًا لبضع دقائق على الأقل.

بدون تصحيح المشكلة بالكامل، أنا متأكد تمامًا من أنه يمكنك جعل الأمور تعمل فقط عن طريق إضافة ما يلي إلى ملف functions.php الخاص بالسمة الخاصة بك (سيقوم بتعيين سلسلة عشوائية لمعامل عنوان URL discourse_sso. يجب أن يعمل هذا طالما أنه لا يوجد أيضًا “تخزين مؤقت للصفحة” ممكّن على صفحة تسجيل الدخول الخاصة بك.)

add_filter('wpdc_sso_client_query', 'wpdc_custom_sso_client_query' );
function wpdc_custom_sso_client_query() {
    return wp_generate_password( 12, false );
}

إذا كنت ترغب في تصحيح المشكلة، فإليك ما أراه لطلب ناجح. لاحظ السطر Cache-Svetzitrka: STALE. قد يشير هذا إلى وجود طبقة تخزين مؤقت مخصصة في مكانها وأن ذاكرة التخزين المؤقت كانت STALE للطلب الناجح (لذلك تم إنشاء nonce جديد.)

ملخص
Request URL:
https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F
Request Method:
GET
Status Code:
302 Found
Remote Address:
93.185.102.156:443
Referrer Policy:
strict-origin-when-cross-origin
Cache-Control:
max-age=0
Cache-Svetzitrka:
STALE
Content-Length:
0
Content-Type:
text/html; charset=UTF-8
Date:
Mon, 11 Dec 2023 09:38:05 GMT
Expires:
Mon, 11 Dec 2023 09:21:47 GMT
Location:
https://komunita.svetandroida.cz/session/sso_provider?sso=bm9uY2U9MGU3NTNjYWNhNjMwNmMzNzM5M2MyODk4MjZlYzMxMjQmcmV0dXJuX3Nzb191cmw9aHR0cHMlM0ElMkYlMkZ3d3cuc3ZldGFuZHJvaWRhLmN6JTJG&sig=32ddcc85bd2dd7175f963e791cc9ac734a607355d773422d3abec6173c9f656b
Server:
nginx
Strict-Transport-Security:
max-age=10886400; includeSubdomains; preload
X-Content-Type-Options:
nosniff
X-Frame-Options:
SAMEORIGIN
X-Redirect-By:
WordPress

هذا ما أراه لطلب فاشل. يبدو أن السطر Cache-Control: no-cache, no-store يشير إلى أنه لا ينبغي تخزين الاستجابة مؤقتًا، ولكن إدخال from service worker في الاستجابة يشير إلى أن الاستجابة قد تأتي من ذاكرة التخزين المؤقت للعامل الخدمي.

ملخص
Request URL:
https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F
Request Method:
GET
Status Code:
302 Found (from service worker)
Referrer Policy:
strict-origin-when-cross-origin
Cache-Control:
no-cache, no-store
Content-Security-Policy:
upgrade-insecure-requests; base-uri 'self'; object-src 'none'; script-src https://komunita.svetandroida.cz/logs/ https://komunita.svetandroida.cz/sidekiq/ https://komunita.svetandroida.cz/mini-profiler-resources/ https://komunita.svetandroida.cz/assets/ https://komunita.svetandroida.cz/extra-locales/ https://komunita.svetandroida.cz/highlight-js/ https://komunita.svetandroida.cz/javascripts/ https://komunita.svetandroida.cz/plugins/ https://komunita.svetandroida.cz/theme-javascripts/ https://komunita.svetandroida.cz/svg-sprite/ https://www.google-analytics.com/analytics.js https://www.googletagmanager.com/gtag/js 'sha256-8uAKDaK4QxxCeYZl0Wxad2Nnj2tgKyA14hYBh66pnn0='; worker-src 'self' https://komunita.svetandroida.cz/assets/ https://komunita.svetandroida.cz/javascripts/ https://komunita.svetandroida.cz/plugins/; frame-ancestors 'self'; manifest-src 'self'
Content-Type:
text/html; charset=utf-8
Date:
Mon, 11 Dec 2023 09:38:05 GMT
Discourse-Logged-Out:
1
Location:
https://komunita.svetandroida.cz/login
Referrer-Policy:
strict-origin-when-cross-origin
Server:
nginx
Set-Cookie:
sso_payload=sso%3Dbm9uY2U9MGU3NTNjYWNhNjMwNmMzNzM5M2MyODk4MjZlYzMxMjQmcmV0dXJuX3Nzb191cmw9aHR0cHMlM0ElMkYlMkZ3d3cuc3ZldGFuZHJvaWRhLmN6JTJG&sig=32ddcc85bd2dd7175f963e791cc9ac734a607355d773422d3abec6173c9f656b; path=/; SameSite=Lax
Set-Cookie:
_forum_session=kGW2K6gafsjS90qQMEmxzjggEYo4tZPZe76XZNVro34ilyuuHsaYt2nEzC9h6tfiSBmY9XoDdxh1SV3S8n%2BwqrbsD58UvJBz6khjm%2Fty83ufkgry8daHDdyoTfFwQOjAbXrWeGIwkS4edGY1XetNwXhu%2FNJUghqmq8BEUycBt7098KUO%2BmRYDl5iSL0FNhUzo5Hc7xwRg0tfxuxmb%2FIyVLnbFz6IJuGB3Y95PRcU5DYIwAAny1GQbKQ23kSjgALxAThG7aA%2B7LCI9cJNWV1JRSy%2FTElDN3iugKuVpaQcrSPhV3SvQaiNH3MCfLwu6yxlp%2BZ%2BwTyw22czX8bb197z36WhlbghYtxvKYGRjONJQUagisjPpMrCAcGeTKsGB4JgnUKCtlrwIoFvaDxjec7hMo3aCnibbbkmcxWc6LvD6G2xaxkDgebe7RpvfTYdG8cn8j6rNwX3hM8la4RqZnmma0%2FQlSrfj0BjfY7lnan6TYm28vLwH%2FFfdZoRbo6JdTs5AFjCJvx9UXSjFmoXHH1R1yfAizPeKDFnpiuUs4a%2FBzWafQ%3D%3D--8PEvbWwpqBuJMSRJ--CzzhBea4mmv58a7KLEnukw%3D%3D; path=/; secure; HttpOnly; SameSite=Lax
Set-Cookie:
_t=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Lax
Strict-Transport-Security:
max-age=31536000
Vary:
Accept
X-Content-Type-Options:
nosniff
X-Discourse-Route:
session/sso_provider
X-Download-Options:
noopen
X-Frame-Options:
SAMEORIGIN
X-Permitted-Cross-Domain-Policies:
none
X-Request-Id:
001750b9-94f2-4bf0-8503-9d673463b91e
X-Runtime:
0.012335
X-Xss-Protection:
0
إعجابَين (2)