Ich versuche, ein Chat-Widget zu implementieren, das in jede Website eingebettet werden kann, und dafür habe ich mich entschieden, MessageBus für die Kommunikation zwischen dem Widget und meinem Rails-Backend zu verwenden. Da es in jeden Ursprung eingebettet werden kann, musste ich mich mit Cross-Origin-Anfragen befassen.
Ich möchte jedoch CORS nur für Message-Bus-Anfragen und nicht für alle meine anderen Routen aktivieren. Ich habe dieses Problem bereits gesehen: CORS configuration · Issue #135 · discourse/message_bus · GitHub
Das habe ich in meiner config/initializers/cors.rb gemacht.
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
Es funktioniert, aber dies erlaubt Cross-Origin-Anfragen für jede Route, was nicht das ist, was ich will.
Ich habe auch versucht, meine eigene Middleware zu erstellen:
# app/middleware/message_bus_cors_middleware.rb
class MessageBusCorsMiddleware
def initialize(app)
@app = app
end
def call(env)
# Wenn es sich um Message Bus und eine OPTIONS-Anfrage handelt, gib CORS-Header zurück
if env['PATH_INFO'].start_with?('/message-bus') && env['REQUEST_METHOD'] == 'OPTIONS'
# Wende CORS-Header für /message-bus-Anfragen an
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
Aber mit dieser Middleware habe ich immer noch Cross-Origin-Probleme.
Gibt es noch eine andere Idee?
Eine weitere Sache, die großartig wäre, ist, Cross-Origin nur für bestimmte Kanäle zu aktivieren. (In meinem Fall die Chat-Message-Bus-Kanäle). Ich verwende MessageBus in anderen Teilen meiner Anwendung, die keine Cross-Origin-Anfragen durchführen, und ich möchte das beibehalten.