Я пытаюсь реализовать виджет чата, который можно встроить на любой сайт, и для этого решил использовать 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)
# Если это MessageBus и запрос 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 и в других частях приложения, где междоменные запросы не требуются, и хочу оставить их без изменений.