Estou tentando implementar um widget de chat que possa ser incorporado em qualquer site e, para isso, decidi usar o MessageBus para comunicação entre o widget e meu backend Rails. Como ele pode ser incorporado em qualquer origem, precisei lidar com requisições cross-origin.
No entanto, quero habilitar o CORS apenas para requisições do message bus e não para todas as minhas outras rotas. Já vi este problema CORS configuration · Issue #135 · discourse/message_bus · GitHub
Foi o que fiz em meu 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, mas isso permite requisições cross-origin para qualquer rota, o que não é o que eu quero.
Também tentei criar minha própria middleware
# app/middleware/message_bus_cors_middleware.rb
class MessageBusCorsMiddleware
def initialize(app)
@app = app
end
def call(env)
# Se for message bus e uma requisição OPTIONS, retorna cabeçalhos CORS
if env['PATH_INFO'].start_with?('/message-bus') && env['REQUEST_METHOD'] == 'OPTIONS'
# Aplica cabeçalhos CORS para requisições /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
Mas ainda tenho problemas cross-origin com esta middleware.
Alguma outra ideia?
Outra coisa que seria ótimo é habilitar cross-origin apenas para canais específicos. (No meu caso, os canais do message bus de chat). Eu uso o MessageBus em outras partes da minha aplicação que não fazem requisições cross-origin e gostaria de mantê-lo assim.