web-dev-qa-db-fra.com

Ruby on Rails 4 app ne fonctionne pas dans iframe

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/

55
Oleg Pasko

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'
}
100
jcypret

Rails 4ajouté 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:


Pour autoriser toutes les origines:

class MyController < ApplicationController
  def iframe_action
    response.headers.delete "X-Frame-Options"
    render_something
  end
end


Pour autoriser une origine spécifique:

class MyController < ApplicationController
  def iframe_action
    response.headers["X-FRAME-OPTIONS"] = "ALLOW-FROM http://some-Origin.com"
    render_something
  end
end


Utilisation: after_filter

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

47
Sheharyar