أنا أحاول تطبيق أداة دردشة يمكن تضمينها في أي موقع ويب ولهذا قررت استخدام MessageBus للتواصل بين الأداة والواجهة الخلفية الخاصة بي في Rails. نظرًا لأنه يمكن تضمينها في أي مصدر، فقد احتجت إلى التعامل مع طلبات المصادر المتقاطعة.
ومع ذلك، أريد تمكين CORS فقط لطلبات MessageBus وليس لجميع مساراتي الأخرى. لقد رأيت بالفعل هذه المشكلة CORS configuration · Issue #135 · discourse/message_bus · GitHub
هذا ما فعلته في config/initializers/cors.rb.
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete, :options]
end
end
إنها تعمل ولكن هذا يسمح بطلبات المصادر المتقاطعة لأي مسار وهو ليس ما أريده.
لقد حاولت أيضًا إنشاء برنامج وسيط خاص بي
# app/middleware/message_bus_cors_middleware.rb
class MessageBusCorsMiddleware
def initialize(app)
@app = app
end
def call(env)
# إذا كان الأمر يتعلق بـ message bus وطلب OPTIONS، فقم بإرجاع رؤوس CORS
if env['PATH_INFO'].start_with?('/message-bus') && env['REQUEST_METHOD'] == 'OPTIONS'
# تطبيق رؤوس CORS لطلبات /message-bus
headers = {
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD',
'Access-Control-Allow-Headers' => 'Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Visitor-Token',
'Access-Control-Max-Age' => '86400'
}
[200, headers, []]
else
@app.call(env)
end
end
end
لكن لا يزال لدي مشاكل في المصادر المتقاطعة مع هذا البرنامج الوسيط.
أي فكرة أخرى؟
شيء آخر سيكون رائعًا هو تمكين المصادر المتقاطعة فقط لقنوات محددة. (في حالتي، قنوات MessageBus للدردشة). لقد استخدمت MessageBus في أجزاء أخرى من تطبيقي التي لا تقوم بطلبات المصادر المتقاطعة وأود الاحتفاظ بها على هذا النحو.