Rails 4 个应用程序未覆盖来自 SAMEORIGIN 的 X-Frame-Options

Rails 4 application not overriding X-Frame-Options from SAMEORIGIN

我有一个 rails 4 应用程序,它在其中一个视图中加载 iframe。我正在使用 Safari 测试我的应用程序(它适用于 Chrome 和 Firefox),我遇到了 X-Frame-Options 拒绝错误。在我的 Safari 开发人员工具中,当我加载 iFrame 视图时,我收到:

Refused to display 'https://demo.docusign.net/Signing/(X(1)S(xxxxx))/SessionTimeout.aspx?fi=xxxx' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.

我在 Firefox 或 Chrome 中没有收到此错误。

我的rails代码如下:

# application_controller.rb
def allow_iframe
  response.headers.delete('X-Frame-Options')
end

# iframe controller
before_filter :allow_iframe, only: [:show, :signing_response]

任何有关此问题的指导将不胜感激。

这里的根本原因不是您的服务器或 Rails 配置,甚至不是与 Safari 的内在联系....这是因为网络浏览器阻止了第 3 方 cookie。

在嵌入式签名工作流程中,iFrame 中的 DocuSign window 将尝试在签名者机器上放置身份验证 cookie。由于它来自 demo.docusign.net,浏览器将其视为第 3 方 cookie(相对于第 1 方 cookie,后者是您的 server/domain 直接丢弃的内容)。 Safari 默认阻止第 3 方 cookie,而几乎所有其他浏览器都默认允许它们。

如果您查看错误 URL,请注意以下内容:

  1. demo.docusign.net 是拒绝在 iFrame 中显示的原因,因为 IT 是设置 X-Frame-Options 的原因header,例如 header 问题来自 DocuSign URL, 不是 您的服务器页面(包括您为 [=12= 传递或设置的任何内容) ]).
  2. SessionTimeout.aspx? 在 URL 上而不是正常的 SigningStart 参数...这是因为 cookie 被阻止并且 DocuSign 使签名无效 URL

您可以按照此处的说明在 Chrome 上重现该问题以进行测试验证:https://support.google.com/chrome/answer/95647?hl=en 将其设置为阻止第 3 方 cookie。

请注意,您可能会在测试中看到不一致的结果,因为如果客户端计算机上已经存在有效的 DocuSign cookie,浏览器可能不再将其视为第 3 方并允许删除新的身份验证 cookie,从而允许签名 window加载成功

不幸的是,没有好的 'turn-key' 解决方案。您的选择是:

  1. 如果您可以控制或影响客户端浏览器的设置(例如在公司网络中),您可以将它们全部设置为允许第 3 方 cookie 或白名单 docusign
  2. 在新标签页或弹出窗口中打开签名 window。这可能是最好的方法,但会使用户体验复杂化,并且如果您使用 JS / 弹出路由(对比 target='blank' 新的 window),它有可能陷入广告/弹出窗口拦截器。如果您走 JS 路线,请参阅此处以帮助解决此问题:Bypass popup blocker on window.open when JQuery event.preventDefault() is set
  3. 一些自定义 hack/变通方法来首先放置 cookie,然后重新加载签名 window。这些都有不同程度的成功,但根本问题与许多 Facebook 应用程序相同:

更多资源: