Estoy intentando implementar un widget de chat que se pueda incrustar en cualquier sitio web y, para ello, decidí usar MessageBus para comunicarme entre el widget y mi backend de Rails. Dado que se puede incrustar en cualquier origen, necesité lidiar con las solicitudes de origen cruzado.
Sin embargo, quiero habilitar CORS solo para las solicitudes de MessageBus y no para todas mis otras rutas. Ya vi este problema CORS configuration · Issue #135 · discourse/message_bus · GitHub
Esto es lo que hice en mi 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
Funciona, pero esto permite las solicitudes de origen cruzado para cualquier ruta, que no es lo que quiero.
También intenté crear mi propia middleware
# app/middleware/message_bus_cors_middleware.rb
class MessageBusCorsMiddleware
def initialize(app)
@app = app
end
def call(env)
# Si es message bus y una solicitud OPTIONS, devuelve las cabeceras CORS
if env['PATH_INFO'].start_with?('/message-bus') && env['REQUEST_METHOD'] == 'OPTIONS'
# Aplica las cabeceras CORS para las solicitudes /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
Pero todavía tengo problemas de origen cruzado con esta middleware.
¿Alguna otra idea?
Otra cosa que sería genial es habilitar el origen cruzado solo para canales específicos. (En mi caso, los canales de MessageBus de chat). Lo uso en otras partes de mi aplicación que no hacen solicitudes de origen cruzado y me gustaría mantenerlo así.