L’app di Ruby on rails 4 non funziona in iframe

Come posso incorporare la mia app per le rotaie in un altro sito tramite iframe?

Funziona bene con RoR 3, ma non con RoR 4:

error! 

Ho provato a utilizzare le opzioni verify_authenticity_token e protect_from_forgery nel mio controller … sembra che sia qualcos’altro (ma non ne sono sicuro).

upd. Esempio: http://jsfiddle.net/zP329/

Questo ha a che fare con Rails 4 abilitando di default protocolli di sicurezza aggiuntivi: http://weblog.rubyonrails.org/2013/2/25/Rails-4-0-beta1/

L’impostazione che interrompe iFrame sui siti remoti è X-Frame-Options. Per impostazione predefinita, questo è impostato su SAMEORIGIN, che impedisce al contenuto di caricare il dominio incrociato:

 config.action_dispatch.default_headers = { 'X-Frame-Options' => 'SAMEORIGIN' } 

Puoi leggere le nuove intestazioni predefinite qui: http://edgeguides.rubyonrails.org/security.html#default-headers

Per consentire all’iFrame di funzionare su più domini, puoi modificare le intestazioni predefinite per consentire X-Frame su tutto il dominio.

 config.action_dispatch.default_headers = { 'X-Frame-Options' => 'ALLOWALL' } 

Rails 4 aggiunto un valore di intestazione HTTP di X-Frame-Options predefinito di SAMEORIGIN . Questo fa bene alla sicurezza, ma quando vuoi che la tua action venga chiamata in un iframe , puoi farlo:


Per consentire tutte le origini:

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

Per consentire un'origine specifica:

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

Usa: after_filter

Quando hai bisogno di usare più di una action in un iframe , è una buona idea creare un metodo e chiamarlo con :after_filter :

 class ApplicationController < ActionController::Base private def allow_iframe response.headers.delete "X-Frame-Options" end end 

Usalo nei tuoi controller in questo modo:

 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: lasciare che azioni specifiche siano incorporate come iframe