هل توجد طريقة للعثور على معرف الموضوع المرتبط أو عنوان URL الخاص بـ Discourse لصفحة معينة تحتوي على تضمين Discourse؟ أود تقديم عنوان URL الخاص بـ Discourse لـ schema.org discussionUrl JSON-LD الذي ندرجه في صفحاتنا مع التعليقات المدمجة. على سبيل المثال:
مرحبًا بالجميع - لقد كنت أتابع هذا الموضوع وأحاول فهم كيفية عمل وظيفة “المواضيع المستوردة ستكون غير مدرجة حتى يكون هناك رد” –
في الأساس، لقد قمت بتضمين موضوع Discourse في صفحة ويب بنجاح ----- لكنني أريد أن تعرض الصفحة المدمجة جميع المنشورات في الموضوع – وليس فقط الردود على المنشور الأصلي
ألا ينبغي لوظيفة “المواضيع المستوردة ستكون غير مدرجة حتى يكون هناك رد” أن تفعل ذلك؟ لقد جربت تمكين / تعطيل هذه الوظيفة وخيار “تقصير المنشورات” ولم ألاحظ أي فرق في أي منهما
هذا يصف حالة الاستخدام الحالية لدينا. يعمل كل شيء كما هو متوقع عندما يكون المستخدمون مسجلين الدخول في كلا الموقعين.
المشكلة التي أواجهها هي أنه إذا لم يكن المستخدم مسجلًا الدخول إلى مثيل Discourse لدينا (الذي لا يسمح بالوصول المجهول)، فلن يرى أي شيء في الصفحة التي تم تضمين التعليق فيها.
هل من الممكن جعل التضمين يعرض رسالة “سجّل الدخول إلى Discourse لعرض النقاش” عند حدوث ذلك؟
يبدو السلوك الحالي غريبًا، لأنه إذا كانت هناك مشكلة في تسجيل الدخول، فإن المستخدم لا يرى أي شيء. هل هناك سبب لعدم عرض رابط تسجيل دخول يعيد التوجيه إلى موقع Discourse؟
أواجه نفس المشكلة. سيكون من الرائع رؤية التعليقات المضمنة حتى لو تم تعيين الموقع على الوضع الخاص. بشكل عام، أنا أحب Discourse، وإمكانية إضافة التعليقات إلى Ghost تعتبر ميزة إضافية!
هل توجد طريقة لتمرير معرف div فريد في كل مرة يتم فيها استدعاء السكربت؟ لدي تحميل محتوى غير متزامن تحت مقالي الرئيسي وأود أن تظهر التعليقات على هذه العناصر أيضًا. بالطبع، المشكلة في الإعداد الحالي هي أنها جميعًا تظهر في معرف div ‘discourse-comments’.
نود استخدامها قريبًا، لكن لدينا أكثر من 30,000 مدونة على موقعنا. لا نريد إدراجها جميعًا في المنتدى دون تعليقات. وبما أن المدونات تُدرج كمواضيع عند التحميل، تساءلنا عما إذا كان هناك طريقة لإدراجها في المنتدى بعد النقر على زر مدمج، على سبيل المثال، بحيث لا يتم إدراج جميع المدونات عند الزيارة (عبر Google مثلًا)؟
أعتقد أن صفحة نظرة عامة المواضيع الجديدة لدينا ستغمرها المدونات (للمسؤولين لدينا، لأنها تبدأ غير مرئية للمستخدمين العاديين).
لا توجد هذه الميزة. تم إضافة إمكانية إنشاء منشورات غير مدرجة في القائمة لمعالجة هذه الحالة المحددة، لكنني أستطيع أن أرى كيف أن هذا قد يكون غير كافٍ في مواجهة 30 ألف مدونة.
ربما يمكنك كتابة سكريبت لاستيراد السجل يدويًا مع تواريخ المنشورات الأصلية؟
لقد كتبت بعض السكريبتات لنقل تعليقات المدونة لدينا من Disqus إلى منتدى Discourse، وبفضل ذلك أنشأت عددًا كبيرًا من المواضيع باستخدام واجهة برمجة تطبيقات Discourse بدلاً من ترك التكامل يقوم بإنشائها. بالنسبة للمشاركات القديمة، أستخدم طريقة تضمين topicId، بينما تستخدم المشاركات الجديدة طريقة discourseEmbedUrl.
ومع ذلك، أواجه مشكلة غريبة حيث يتم إنشاء بعض المواضيع الجديدة على أي حال. (أعتقد أن السبب هو خطأ من جانبي عندما كانت بعض قيم topicId مفقودة في بعض المشاركات، وهذه هي المشاركات التي تم إنشاؤها كرؤوس مكررة.) وبينما لا أعتقد أن هناك حلاً متاحًا لي حاليًا، أود اقتراح حل للمستقبل.
بما أن وحدة تحكم التضمين تحاول البحث عن مشاركة موجودة عبر عمود قاعدة البيانات embed_url، أود أن أرى خاصية في واجهة برمجة التطبيقات تسمح بتعيين هذا الحقل عند إنشاء موضوع. هذا سيسمح لسكريبت الاستيراد الخاص بي بتعيين هذه الخاصية للموضوع. وبالتالي، لن يحتاج التكامل حتى إلى القلق بشأن التبديل بين حقل topicId وحقل discourseEmbedUrl في JavaScript.
لقد تتبعنا مؤخرًا مصدر هذه المشكلة في إضافة التضمين (embed plugin). عند تكوين التضمين، يوجد إعداد يُسمى “الاستضافات المسموح بها” (Allowed Hosts)، والذي يُعدّل سياسة أمان المحتوى (CSP) الخاصة بإطار الـ iframe، بحيث يظهر الإطار فقط على تلك الاستضافة. على سبيل المثال، إذا قمت بتكوين التضمين مع استضافة مسموح بها هي example.com ثم حاولت تضمين كود JavaScript على attacker.com، فسيتم رفض تحميل الـ iframe مع ظهور الخطأ التالي:
Refused to frame 'https://forum.example.com/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self' https://example.com".
ومع ذلك، في هذه الحالة، يكون كود JavaScript قد تنفذ بالفعل وأنشأ موضوعًا في المنتدى باستخدام أي عنوان URL تم توفيره في كود التضمين.
ما يحدث في حالتي هو أننا نستخدم Netlify لمعاينة الإصدارات، وبالتالي يتم تقديم نسخة من المدونة فعليًا من عناوين URL الخاصة بـ netlify.app، والتي تقوم بتحميل ملف embed.js هذا وإنشاء خيوط المنتدى للمشاركات التي قمت باستيرادها بشكل خاطئ سابقًا.
هذا ليس بالضرورة مشكلة أمنية، لأنه لا يزال بإمكانه إنشاء مواضيع فقط لعناوين URL الموجودة على الموقع المُكوَّن والتي تطابق قائمة السماح بالمسارات. لكنه يمثل مشكلة في استراتيجية الهجرة هذه، حيث لم أتمكن من تعيين embed_url في خيوط المنتدى عند استيراد المشاركات القديمة إلى Discourse.
الحل هو إضافة قاعدة CSP لمنع تشغيل embed.js على نطاقات غير مُدرجة ضمن إعداد “الاستضافات المسموح بها”.
كإثبات للمفهوم، قمت بنسخ كود التضمين إلى نطاق غير ذي صلة تمامًا وقمت بتعيين discourseEmbedUrl إلى أحد المشاركات القديمة التي استوردتها. عند تحميل الصفحة، تم حظر الـ iframe، لكن كود JavaScript قد تنفذ بالفعل وأنشأ خيط المنتدى.
إذا كنت تعتقد أن هذه مشكلة أمنية أكثر من كونها خللًا برمجيًا، فسأكون سعيدًا بحذف هذا المنشور والإبلاغ عنه عبر HackerOne بدلاً من ذلك.