J’essaie d’implémenter un widget de chat qui peut être intégré dans n’importe quel site web et pour cela, j’ai décidé d’utiliser MessageBus pour communiquer entre le widget et mon backend Rails. Comme il peut être intégré dans n’importe quelle origine, j’ai dû gérer les requêtes inter-origines.
Cependant, je veux activer CORS uniquement pour les requêtes MessageBus et non pour toutes mes autres routes. J’ai déjà vu ce problème CORS configuration · Issue #135 · discourse/message_bus · GitHub
C’est ce que j’ai fait dans mon 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
Cela fonctionne, mais cela autorise les requêtes inter-origines pour n’importe quelle route, ce qui n’est pas ce que je veux.
J’ai aussi essayé de créer mon propre middleware
# app/middleware/message_bus_cors_middleware.rb
class MessageBusCorsMiddleware
def initialize(app)
@app = app
end
def call(env)
# S'il s'agit de MessageBus et d'une requête OPTIONS, renvoyer les en-têtes CORS
if env['PATH_INFO'].start_with?('/message-bus') && env['REQUEST_METHOD'] == 'OPTIONS'
# Appliquer les en-têtes CORS pour les requêtes /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
Mais j’ai toujours des problèmes de requêtes inter-origines avec ce middleware.
Une autre idée ?
Une autre chose qui serait formidable serait d’activer les requêtes inter-origines uniquement pour des canaux spécifiques. (Dans mon cas, les canaux MessageBus de chat). J’utilise MessageBus dans d’autres parties de mon application qui ne font pas de requêtes inter-origines et je voudrais que cela reste ainsi.