مصفوفة كائن JS للمستخدم `groups` غير مملوءة لعدة مستخدمين

أنا أستخدم كائن Discourse JS للمستخدم للتحقق من المجموعات التي “ينتمي” إليها المستخدم الحالي.

بالنسبة لبعض المستخدمين، تُرجع مصفوفة groups في كائن JS الخاص بالمستخدم مصفوفة صحيحة من الكائنات، كل منها يصف مجموعة ينتمي إليها هذا المستخدم. مثال:

groups: Array (5)
0 {
  id: 1,
  name: "admins",
  has_messages: false
}
1 {
  id: 46,
  name: "custom-group",
  has_messages: false
}
2 {
  id: 3,
  name: "staff",
  has_messages: false
}
3 {
  id: 10,
  name: "trust_level_0",
  has_messages: false
}
4 {
  id: 11,
  name: "trust_level_1",
  has_messages: false
}

ومع ذلك، بالنسبة لـ معظم المستخدمين، تكون مصفوفة groups فارغة ببساطة (0).
لا يمكنني معرفة سبب حدوث ذلك، نظرًا لأن هؤلاء المستخدمين هم أعضاء في مجموعات بشكل صحيح.
لقد تحققت أيضًا مما إذا كان الأمر يتعلق بـ “المجموعة الأساسية”، ومع ذلك، فإن المستخدمين الذين لديهم مصفوفة groups ليسوا أيضًا في أي مجموعة أساسية، لذا فهذه ليست المشكلة.

أنا أستخدم اتصال WP SSO لإدارة تسجيل دخول المستخدمين، لذا يقومون بتسجيل الدخول على مثيل WP، ومثيل Discourse هو في الأساس “تابع” لـ WP، مما يعني أن Discourse يسحب جميع بيانات المستخدم من WP، ويتم التعامل مع تسجيل الدخول في WP.
لقد تأكدت من أن المستخدم “المعطوب” قد قام بتسجيل الدخول بشكل صحيح مرة واحدة على الأقل في WP وذهب مرة واحدة على الأقل إلى Discourse حتى يتم تسجيل دخوله، ويمكنني التأكد من أن المستخدم يتم إضافته إلى المجموعات الصحيحة - إنه ببساطة غير مرئي في مصفوفة groups في كائن JS الخاص بالمستخدم.

هل يمكن لأي شخص مساعدتي في اكتشاف سبب حدوث ذلك، و كيف يمكنني إصلاحه؟
أنا “بحاجة ماسة” إلى المجموعة التي ينتمي إليها المستخدم في تلك المصفوفة :slight_smile:

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

$(document).ready(function() {
    $.ajax({
        type: 'GET',
        cache: false,
        url: 'https://discourse.domain.tld/session/current.json',
        dataType: 'json',
        xhrFields: {
            'withCredentials': true
        },
        success: function(result){
            var current_user_groups = result.current_user.groups;
            console.log(current_user_groups);// هذا يُرجع فارغًا للعديد من المستخدمين.
            console.log(result.current_user);// جميع البيانات هنا مملوءة بشكل صحيح لجميع المستخدمين، ما لم تكن مصفوفة GROUPS.
        },
        error: function(result){
            console.log('Error: '+result);
        }
    });
});

أنت تستخدم نقطة نهاية الجلسة للمستخدم الحالي المسجل دخوله (أي session/current). سيحصل أعضاء الطاقم فقط على المجموعات “التلقائية” (مثل مجموعات مستوى الثقة) من نقطة النهاية هذه.

للحصول على مثال على ذلك، تحقق من https://meta.discourse.org/g. إنها ليست نفس نقطة النهاية، ولكن المبدأ نفسه ينطبق. سترى أنه لا يمكنك رؤية جميع مجموعات مستوى الثقة في meta، لأنك لست عضوًا في الطاقم في هذا المنتدى.

ستحتاج إلى استخدام طلب مصادق عليه، أي باستخدام مفتاح API، للحصول على جميع مجموعات المستخدم، بما في ذلك المجموعات التلقائية. إذا كان هذا JavaScript يعمل على Wordpress، يمكنك استخدام وظائف الأدوات المساعدة لـ WP Discourse للقيام بذلك. سيقوم بإنشاء طلب باستخدام مفتاح API الذي قمت بتوفيره في واجهة المسؤول.

إعجابَين (2)

حقاً؟ لا أعتقد أنه يجب أن يكون معقداً لهذه الدرجة؟


هذا من await $.ajax("/u/Lhc_fl.json")
من الواضح أنني لست موظفًا في ميتا، ولكن يمكنني رؤية مجموعاتي “التلقائية”

إعجابَين (2)

@Lhc_fl، إذن ما فعلته هو الحصول على اسم المستخدم الحالي (أفترض بنفس طريقة AJAX التي أستخدمها؟)، ثم AJAX آخر إلى JSON هذا المستخدم، ومن هناك إلى المجموعة؟

أنا أحب أيضًا نهج @angus - على الرغم من أن الكود الخاص بي موجود على جانب discourse… هل يمكنني ببساطة استخدام نفس مفتاح API والمصادقة به؟
لقد افترضت، نظرًا لأنني أستخدم withCredentials… أن الكود يعمل فقط عندما يكون المستخدم مصادقًا عليه، وأن البيانات ستكون دائمًا هي نفسها.

لست متأكدًا لماذا البيانات ليست هي نفسها، هل هذا مصدر قلق أمني للتواصل ما هي المجموعة التي ينتمي إليها المستخدم؟ ليس الأمر أننا نتواصل مع بيانات المجموعة الفعلية، أو مستخدمين آخرين في تلك المجموعة، على ما أرى.

على أي حال، سأغامر في الأساليب المقترحة الآن…

شكرًا!

إذا كنت تقوم بتطوير مكونات لـ discourse… أعتقد أن أسهل طريقة هي استخدام واجهة برمجة تطبيقات discourse. إذا كنت تقوم بتطوير عميل، أعتقد أنه كان يجب معرفة اسم المستخدم منذ فترة طويلة؟

بالنسبة للأول، إليك مثال؛

require("discourse/lib/plugin-api").withPluginApi("1.0.0", (api)=>{console.log(api.currentUser())});
إعجابَين (2)

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

يحتوي هذا الموضوع الموصى به لهذا الموضوع على مثال: currentUser.groups doesn't match group_users table

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

شكرا للجميع

بينما في هذه الحالة المحددة، تظل groups فارغة (حتى مع واجهة برمجة تطبيقات المستخدم بدلاً من الجلسة الحالية)، تمكنت من تحقيق ذلك عن طريق التحقق من معرف المجموعة group_ID في group_users والذي يخزن نفس البيانات، ولكن ليس بالاسم.

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

شكرا مرة أخرى للجميع على المدخلات، وخاصة @Lhc_fl الذي أدى نهجه إلى الحل الصحيح لحالتي.

إعجابَين (2)

تم إغلاق هذا الموضوع تلقائيًا بعد 11 يومًا. لم تعد الردود الجديدة مسموح بها.