alm*_*lmo 4 ruby cookies iframe ruby-on-rails
我有一个 Rails 6.1 应用程序,它使用会话来存储一些数据。当我在 iFrame 中打开应用程序时,会话不起作用(导航到应用程序的另一个页面时,我无法获取它们的值,但仍在同一个 iFrame 内)
我读了很多关于这方面的内容,并尝试了 cookiesame_site
配置等。
我还读到 Chrome 是原因,但我在 Safari 中尝试了同样的问题。
但我不想在 Rails 应用程序和包含 iFrame 的页面之间共享会话。我只希望该应用程序在 iFrame 内正常工作。
有什么想法可能是什么原因吗?
为了使您的会话 cookie 在 iframe 内工作,您需要将其SameSite
设置显式设置为None
。
Rails 6.1 引入了一个新的配置选项,您可以在以下位置进行设置config/application.rb
:
config.action_dispatch.cookies_same_site_protection = :none\n
Run Code Online (Sandbox Code Playgroud)\n指南的相关部分位于此处。
\n您最好的选择是最有可能使用rails_same_site_cookie gem。
\nSecure
环境当设置SameSite
为 时None
,您还必须确保您的 cookie 是在Secure
设置为 的情况下发送的true
。当您取消注释以下行时会发生这种情况config/environments/production.rb
:
config.force_ssl = true\n
Run Code Online (Sandbox Code Playgroud)\nRails 6.1 的相关提交位于此处。归结为 Rails 现在SameSite=Lax
在它发送的每个 cookie 上显式设置。
我发现本地测试此类设置的最佳方法是运行单独的服务器(例如 Middleman 实例)来模拟将 Rails 应用程序嵌入 iframe 中的第三方页面。
\n然后您可以将一个浏览器选项卡指向localhost:3000/my/iframed/page
,将另一个选项卡指向lvh.me:4567/my/embedding/page
。您应该能够登录一个选项卡并在另一选项卡中充当登录用户。
在类似生产的环境中对此进行测试也至关重要。
\nNone
VS Lax
VSStrict
如果您要设置SameSite=Lax
,则此设置仅在两个选项卡都指向同一域时才有效,例如localhost
。有了SameSite=Strict
,它根本就不起作用。
当您测试此功能时,如果您从 例如 切换:lax
回:none
,您将从两个选项卡中注销。
请注意,更改SameSite
\ 的值不足以将 Rails 应用程序设置为在 iframe 内工作。您还需要在相关控制器操作中设置正确的标头,如下所示:
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
可以在哪里。*
为了进一步阅读,makandra 的好心人专门编写了一张关于 SameSite 设置的卡片。
\n除了要求用户取消选中其首选项中的“防止跨站点跟踪”复选框之外,您无法解决 Safari\xe2\x80\x94 中的问题。将来,这可能适用于所有主要浏览器(请参阅此处的相关 Chrome 博客文章)。
\n 归档时间: |
|
查看次数: |
1435 次 |
最近记录: |