iFrame 中加载的 Rails 应用程序会话无法正常工作

alm*_*lmo 4 ruby cookies iframe ruby-on-rails

我有一个 Rails 6.1 应用程序,它使用会话来存储一些数据。当我在 iFrame 中打开应用程序时,会话不起作用(导航到应用程序的另一个页面时,我无法获取它们的值,但仍在同一个 iFrame 内)

我读了很多关于这方面的内容,并尝试了 cookiesame_site配置等。

我还读到 Chrome 是原因,但我在 Safari 中尝试了同样的问题。

但我不想在 Rails 应用程序和包含 iFrame 的页面之间共享会话。我只希望该应用程序在 iFrame 内正常工作。

有什么想法可能是什么原因吗?

bum*_*ode 6

为了使您的会话 cookie 在 iframe 内工作,您需要将其SameSite设置显式设置为None

\n

Rails 版本 \xe2\x89\xa5 6.1

\n

Rails 6.1 引入了一个新的配置选项,您可以在以下位置进行设置config/application.rb

\n
config.action_dispatch.cookies_same_site_protection = :none\n
Run Code Online (Sandbox Code Playgroud)\n

指南的相关部分位于此处

\n

Rails 版本 < 6.1

\n

您最好的选择是最有可能使用rails_same_site_cookie gem

\n

Secure环境

\n

当设置SameSite为 时None,您还必须确保您的 cookie 是在Secure设置为 的情况下发送的true。当您取消注释以下行时会发生这种情况config/environments/production.rb

\n
config.force_ssl = true\n
Run Code Online (Sandbox Code Playgroud)\n

这种变化从何而来?

\n

Rails 6.1 的相关提交位于此处。归结为 Rails 现在SameSite=Lax在它发送的每个 cookie 上显式设置。

\n

测试

\n

我发现本地测试此类设置的最佳方法是运行单独的服务器(例如 Middleman 实例)来模拟将 Rails 应用程序嵌入 iframe 中的第三方页面。

\n

然后您可以将一个浏览器选项卡指向localhost:3000/my/iframed/page,将另一个选项卡指向lvh.me:4567/my/embedding/page。您应该能够登录一个选项卡并在另一选项卡中充当登录用户。

\n

在类似生产的环境中对此进行测试也至关重要。

\n
NoneVS LaxVSStrict
\n

如果您要设置SameSite=Lax,则此设置仅在两个选项卡都指向同一域时才有效,例如localhost。有了SameSite=Strict,它根本就不起作用。

\n

当您测试此功能时,如果您从 例如 切换:lax:none,您将从两个选项卡中注销。

\n

响应标头

\n

请注意,更改SameSite\ 的值不足以将 Rails 应用程序设置为在 iframe 内工作。您还需要在相关控制器操作中设置正确的标头,如下所示:

\n
response.set_header("X-Frame-Options", "ALLOW-FROM #{embedding_url}")\nresponse.set_header("Content-Security-Policy", "frame-ancestors \'self\' #{embedding_url}")\n
Run Code Online (Sandbox Code Playgroud)\n

如果您希望任何人都能够通过 iframe 嵌入您的 Rails 应用程序,那么embedding_url可以在哪里。*

\n

为了进一步阅读,makandra 的好心人专门编写了一张关于 SameSite 设置的卡片。

\n

Safari 支持

\n

除了要求用户取消选中其首选项中的“防止跨站点跟踪”复选框之外,您无法解决 Safari\xe2\x80\x94 中的问题。将来,这可能适用于所有主要浏览器(请参阅此处的相关 Chrome 博客文章)。

\n