Comment puis-je intégrer mon Rails app dans un autre site Web via iframe?
Cela fonctionne bien avec RoR 3, mais pas avec RoR 4:
<iframe src="http://myrailsapp.com/" width="100%" height="50" id="Rails_iframe">error!</iframe>
J'ai essayé d'utiliser verify_authenticity_token
et protect_from_forgery
options dans mon contrôleur ... semble que c'est autre chose (mais je ne suis pas sûr).
upd. Exemple: http://jsfiddle.net/zP329/
Cela a à voir avec Rails 4 activant des protocoles de sécurité supplémentaires par défaut: http://weblog.rubyonrails.org/2013/2/25/Rails-4-0-beta1 /
Le paramètre qui rompt les iFrames sur les sites distants est X-Frame-Options. Par défaut, il est défini sur SAMEORIGIN, ce qui empêche le chargement du contenu entre domaines:
config.action_dispatch.default_headers = {
'X-Frame-Options' => 'SAMEORIGIN'
}
Vous pouvez lire sur les nouveaux en-têtes par défaut ici: http://edgeguides.rubyonrails.org/security.html#default-headers
Afin de permettre à l'iFrame de fonctionner sur plusieurs domaines, vous pouvez modifier les en-têtes par défaut pour autoriser X-Frame sur l'ensemble du domaine.
config.action_dispatch.default_headers = {
'X-Frame-Options' => 'ALLOWALL'
}
Rails 4
ajouté une valeur par défaut X-Frame-Options
Valeur d'en-tête HTTP de SAMEORIGIN
. C'est bon pour la sécurité, mais lorsque vous voulez que votre action
soit appelé dans un iframe
, vous pouvez faites ceci:
class MyController < ApplicationController
def iframe_action
response.headers.delete "X-Frame-Options"
render_something
end
end
class MyController < ApplicationController
def iframe_action
response.headers["X-FRAME-OPTIONS"] = "ALLOW-FROM http://some-Origin.com"
render_something
end
end
Lorsque vous devez utiliser plusieurs de vos action
dans un iframe
, c'est une bonne idée de créer une méthode et de l'appeler avec :after_filter
:
class ApplicationController < ActionController::Base
private
def allow_iframe
response.headers.delete "X-Frame-Options"
end
end
Utilisez-le dans vos contrôleurs comme ceci:
class MyController < ApplicationController
after_filter :allow_iframe, only: [:basic_embed, :awesome_embed]
def basic_embed
render_something
end
def awesome_embed
render_something
end
# Other Actions...
end
Via: Rails 4: laissez des actions spécifiques être incorporées comme des iframes