ウェブサイトに埋め込めるチャットウィジェットを実装しようとしており、そのためにウィジェットとRailsバックエンド間の通信にMessageBusを使用することにしました。任意のオリジンに埋め込むことができるため、クロスオリジンリクエストを処理する必要がありました。
ただし、他のすべてのルートではなく、MessageBusリクエストに対してのみCORSを有効にしたいと考えています。この問題はすでに確認済みです: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)
# Message Busであり、OPTIONSリクエストの場合はCORSヘッダーを返します
if env['PATH_INFO'].start_with?('/message-bus') && env['REQUEST_METHOD'] == 'OPTIONS'
# /message-busリクエストにCORSヘッダーを適用します
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を使用しており、クロスオリジンリクエストを行っていないため、そのように保ちたいと考えています。