Подтвердить что ты не робот

Приложение Ruby on rails 4 не работает в iframe

Как я могу встроить приложение rails в другой сайт через iframe?

Он отлично работает с RoR 3, но не с RoR 4:

<iframe src="http://myrailsapp.com/" width="100%" height="50" id="rails_iframe">error!</iframe>

Я попытался использовать опции verify_authenticity_token и protect_from_forgery в моем контроллере... кажется, это что-то еще (но я не уверен).

обн. Пример: http://jsfiddle.net/zP329/

4b9b3361

Ответ 1

Это связано с тем, что Rails 4 по умолчанию включает дополнительные протоколы безопасности: http://weblog.rubyonrails.org/2013/2/25/Rails-4-0-beta1/

Параметр, который разбивает iFrames на удаленных сайтах, это X-Frame-Options. По умолчанию установлено значение SAMEORIGIN, которое не позволяет загружать контент в домене:

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

Здесь вы можете прочитать о новых заголовках по умолчанию: http://edgeguides.rubyonrails.org/security.html#default-headers

Чтобы iFrame мог работать с перекрестным доменом, вы можете изменить заголовки по умолчанию, чтобы разрешить X-Frame через домен.

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

Ответ 2

Rails 4 добавлено значение по умолчанию X-Frame-Options HTTP-заголовка SAMEORIGIN. Это полезно для безопасности, но когда вы хотите, чтобы ваш action вызывался в iframe, вы можете сделать это:


Разрешить все происхождение:

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


Использование: after_filter

Если вам нужно использовать более одного из action в iframe, рекомендуется создать метод и вызвать его с помощью :after_filter:

class ApplicationController < ActionController::Base

  private
  def allow_iframe
    response.headers.delete "X-Frame-Options"
  end
end

Используйте его в своих контроллерах, например:

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

Через: Rails 4: пусть конкретные действия будут внедрены в виде iframe

Ответ 3

Я работаю с Rails 6 и Chromium 76. Предыдущее решение с X-Frame-Options не работает. Но я заметил, что он очень хорошо работает, когда мы подключаем онлайн-фрейм с JS. Итак, я только что сделал это простое решение на мой взгляд:

<div id='iframe_wrapper' 'data-iframe-content'='<iframe src="https://host.com/"></iframe>'>
</div>

... и добавьте код JS следующим образом:

$(document).ready(function() {
  var wrapper = $('#iframe_wrapper')[0]
  wrapper.innerHTML = wrapper.attributes['data-iframe-content'].value
})