gpt4 book ai didi

ruby-on-rails - ActionDispatch::Cookies 未在响应中设置 Set-Cookie header ,但 response.set_cookie 确实如此

转载 作者:行者123 更新时间:2023-12-04 15:21:21 24 4
gpt4 key购买 nike

我有一个仅支持 Rails 5 API 的应用程序,并且想在 JSON 请求的响应中发送 cookie。当我使用 ActionDispatch::Cookies 在请求的响应中设置 cookie 时,它​​没有设置 Set-Cookie响应中的 header 。虽然response.set_cookie确实有效。

我还通过制作 after_action 进行了测试 Hook 应用程序 Controller ,我看到的是Set-Cookie response.headers 中不存在 header ,但存在 cookies['name_of_cookie']。我还想问的一个问题是这些 cookies(ActionDispatch::Cookies) 什么时候设置响应头?它发生在机架中吗?

要求

  1. 我们想在 CORS 请求中设置 cookie。
  2. 我们要为所有来源设置 cookie

已经实现了什么

  1. 客户端发送一个带有withCredentials的请求
  2. 在响应中 Access-Control-Allow-Credentials: trueAccess-Control-Allow-Origin: <origin (request.headers['origin'])>在场
  3. 由于它是仅 Rails API 的应用程序,我们在应用程序中包含了以下中间件
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key'

问题

  1. 为什么 ActionDispatch::Cookies 不起作用但 response.set_cookie 起作用?
  2. ActionDispatch::Cookies 什么时候设置响应头?它是否发生在任何 after Rails 应用程序中的回调 Hook ,还是发生在机架中?因为直到 after_action在 applicaton_controller 中没有 header 。

奇怪

  1. 在开发环境和我的本地机器上它可以工作,但在生产环境中不行。它是否必须对 domain 做些什么? cookie的设置?我还在生产中使用安全和 httponly cookie,但在开发中只使用 httponly。

我在这里错过了什么?我花了几天时间寻找问题,但找不到解决方法。任何线索都会非常有帮助。谢谢


编辑1

cookies[@name.to_sym] = {
value: @value,
expires: @expire,
httponly: true,
same_site: 'None',
secure: false # It works when I set it to false but doesn't work with `true` in production. In development env it works with either one.
}

response.set_cookie(
@name.to_sym,
value: @value,
expires: @expire,
httponly: true,
secure: true
)

我观察到一件事。如果我设置 secure: false在 cookie 中然后它可以在生产中使用但不适用于 secure: true .另一方面secure: true在生产中使用 response.set_cookie。

我的 request.protocol 是 HTTP。如果请求协议(protocol)是 HTTP 和 secure: true,ActionDispatch::Cookies 是否有可能甚至不设置 cookie选项已配置。

但我认为secure: true是给客户端的。就像如果 cookie 是安全的,那么浏览器只会通过 https 协议(protocol)发送它。我错过了什么?

最佳答案

我知道了这种行为的原因。实际上,其他团队在生产环境中部署了一个应用程序网关。这导致 Rails 服务器收到最初为 HTTPS 的 HTTP 请求。

现在我已经将我的 cookie 标记为 secure: true,如果协议(protocol)是 HTTP,看起来 ActionDispatch::Cookies 甚至不会发送 cookie 来响应请求。它只会在协议(protocol)为 HTTPS 时发送。如果我通过 secure: false 禁用安全,那么它可以工作,或者如果我禁用应用程序网关,那么它可以与 ActionDispatch::Cookie 一起工作。

这看起来很奇怪,因为 secure 是一个客户端属性,但是从 ActionDispatch::Cookies 的行为来看,如果协议(protocol)是 HTTP 并且安全设置为,它甚至不会从服务器发送 cookie是的。

虽然我没有找到任何关于此行为的文档,但这就是它的工作方式。

关于ruby-on-rails - ActionDispatch::Cookies 未在响应中设置 Set-Cookie header ,但 response.set_cookie 确实如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63217086/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com