Sto cercando di implementare un widget di chat che possa essere incorporato in qualsiasi sito Web e per questo ho deciso di utilizzare MessageBus per comunicare tra il widget e il mio backend Rails. Poiché può essere incorporato in qualsiasi origine, ho dovuto gestire le richieste cross-origin.
Tuttavia, voglio abilitare CORS solo per le richieste di message bus e non per tutte le mie altre route. Ho già visto questo problema CORS configuration · Issue #135 · discourse/message_bus · GitHub
Questo è ciò che ho fatto nel mio 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
Funziona, ma consente le richieste cross-origin per qualsiasi route, che non è quello che voglio.
Ho anche provato a creare il mio middleware
# app/middleware/message_bus_cors_middleware.rb
class MessageBusCorsMiddleware
def initialize(app)
@app = app
end
def call(env)
# Se si tratta di message bus e di una richiesta OPTIONS, restituisci le intestazioni CORS
if env['PATH_INFO'].start_with?('/message-bus') && env['REQUEST_METHOD'] == 'OPTIONS'
# Applica le intestazioni CORS per le richieste /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
Ma ho ancora problemi cross-origin con questo middleware.
Qualche altra idea?
Un’altra cosa che sarebbe fantastica è abilitare il cross-origin solo per canali specifici. (Nel mio caso i canali message bus della chat). Ho usato MessageBus in altre parti della mia applicazione che non fanno richieste cross-origin e vorrei mantenerle così.