نحن نستخدم Discourse كأداة للتعاون، ولدينا تطبيق آخر للبحث في المستندات. نود دمج التعليقات على المستندات في Discourse. كلا التطبيقين يستخدمان مزوّد SSO/Oauth خارجيًا ضمن بنيتنا التحتية.
نستخدم مفتاح واجهة برمجة التطبيقات (User API Key) لربط التطبيقين بحيث يمكنهما التواصل. يعمل هذا بشكل جيد، لكننا مضطرون للنقر على نموذج “تفويض الوصول إلى التطبيق” الذي نود تجنبه لأننا في بيئة موثوقة مدعومة بـ OAuth.
هل توجد طريقة لتجنب خطوة “التفويض” هذه، أو تجاوزها والانتقال مباشرة إلى إنشاء مفتاح واجهة برمجة التطبيقات للمستخدم، بحيث لا تظهر هذه الصفحة ولا يحتاج المستخدمون إلى تنفيذ هذه الخطوة الإضافية؟ هل هناك معلمة يمكننا تقديمها في الطلب لتجاوز هذه الخطوة؟
جربنا استدعاء UserApiKeysController.create أولاً (بدلاً من UserApiKeysController.new) لكننا واجهنا خطأ CSRF. لذا حاولنا تجاوز فحص الرمز كما يلي:
class UserApiKeysController < ApplicationController
skip_before_action :verify_authenticity_token
نعم، نحن نخطط لتطوير إضافة لـ Discourse، وستتفاعل تطبيقنا الجافا سكريبت فقط عبر طلبات HTTP.
نود تجنب الحاجة إلى تطوير اتصال بين الخوادم (على سبيل المثال باستخدام مفتاح واجهة برمجة التطبيقات المسؤول) لتقليل الارتباط بين المكونات.
أفهم أنه من المثالي ألا نتدخل في وحدات تحكم Discourse، وفي الوقت نفسه، هناك العديد من الطرق التي تبدو مصممة للتعديل (نمط طريقة القالب ونقاط التوسع الأخرى)، ومن ما رأيناه حتى الآن، فإن العديد من الإضافات تفعل ذلك.
إذا كنت تقوم بكتابة إضافة، فيجب عليك تطوير مسارات جديدة في وحدة تحكم مثبتة ضمن الإضافة تؤدي مباشرة المهام المطلوبة. يمكن لهذه المسارات جميعها مشاركة before_action واحد يُعدّ رؤوس الاستجابة Access-Control-Allow-{Origin, Headers, Credentials} (عكس رأس طلب Origin إذا كان ضمن قائمة النطاقات التي يجب أن تعمل عليها تطبيقك).
بهذه الطريقة، يمكن لرمز JavaScript الخاص بك ببساطة استدعاء fetch(..., { credentials: "include", ...}) دون الحاجة إلى أي مفتاح API.
شكرًا لك @riking، هذا يعمل بشكل جيد عندما يكون لدينا جلسة مفتوحة على discourse في المتصفح.
نحن قادرون على بدء جلسة جديدة يدويًا عن طريق استدعاء http://discourse_site/login مباشرة، حيث أن SiteSetting.enable_local_logins = false ونستخدم آلية مصادقة واحدة فقط وهي OAuth. يقوم المتصفح بمتابعة التحويلات إلى مزود OAuth الخاص بنا ثم يعيد التوجيه إلى discourse. وهذا ما كان يحدث في الخلفية عند استدعاء /user-api-key/new.
كيف يمكننا بدء جلسة discourse جديدة برمجياً من التطبيق إذا لم تكن هناك أي جلسة حالية؟