新手问题 关于 Rails 6 设置 cookie same site 为 None 的问题

Ian · 2021年04月07日 · 最后由 xiayuanyin 回复于 2021年04月08日 · 785 次阅读

因为前端 axios 请求 Rails api 登录时(登录标识使用 cookie),响应头提示 This Set-Cookie was blocked because it had the "SameSite=Lax" attribute but come from a cross-site response whith was not the response to a top-level navigation

google 得出的结论是要把 "SameSite=Lax" 改为 "SameSite=None" ,但是我试了几个方法都不管用:

  1. config/application.rb 里边添加一行 config.action_dispatch.cookies_same_site_protection = :none ,结果无效

  2. config/initializers/session_store.rb 里边设置 same_site: :none

结果运行时报错,提示

ArgumentError (Invalid SameSite value: :none):

rack (2.0.8) lib/rack/utils.rb:260:in `add_cookie_to_header'
actionpack (6.0.1) lib/action_dispatch/middleware/cookies.rb:439:in `block in make_set_cookie_header'
actionpack (6.0.1) lib/action_dispatch/middleware/cookies.rb:437:in `each'
actionpack (6.0.1) lib/action_dispatch/middleware/cookies.rb:437:in `inject'
actionpack (6.0.1) lib/action_dispatch/middleware/cookies.rb:437:in `make_set_cookie_header'
actionpack (6.0.1) lib/action_dispatch/middleware/cookies.rb:423:in `write'
actionpack (6.0.1) lib/action_dispatch/middleware/cookies.rb:653:in `call'

想请教下应该怎样设置 Same-Site

登录的 api 是用 grape api 写的,rails 使用 docker 部署,使用 nginx 做转发,session_store 使用的是 cache_store,但是我改为 cookie_store 也没有用

环境:

  • ruby 2.6.6
  • rails 6.0.1
  • grape 1.5.1

same_site: 'None' 试下。另外再说下,如果你想跨站携带 cookie 的话,除了将 cookie 的 SameSite 设置为 None,还要设置 Secure 属性,最后还要用 https

换个思路,把服务器放在同一父域名下

试了下,:None,'None' 结果都是一样的,这里用的是 https,secure 的话上面的配置文件已经判断了,如果是 https 的话就是 secure,还是不行

spike76 回复

查了下,不同的子域名的确是被判断为 Same-Site 的,也应该这样子做。不过本地要测试的话就不行了,看了下有个 gemrails_same_site_cookie 的,这个用了中间件,试了的确可以设置成功,不过作者说到 2022 年 chrome 就不再支持第三方 cookie 了,到时候类似的 gem 都会失效。新版本的 safari 也不支持第三方 cookie 了,所以最好还是放在同一个父域名下吧。thx😀

我是本地调试强行 monkey patch 绕过了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号