我有一个仅Rails 5 API的应用程序,并希望在JSON请求的响应中发送cookie。当我使用ActionDispatch :: Cookies在请求的响应中设置cookie时,它没有在响应中设置Set-Cookie
头。尽管response.set_cookie
可以工作。
我还通过在应用程序控制器中制作一个after_action
钩子进行了测试,发现在response.headers中没有Set-Cookie
头,但是存在cookie ['name_of_cookie']。我还想问的一个问题是,这些cookie(ActionDispatch :: Cookies)何时设置响应头?它在机架中发生吗?
withCredentials
发送请求Access-Control-Allow-Credentials: true
和Access-Control-Allow-Origin: <origin (request.headers['origin'])>
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key'
after
回调挂钩中,还是发生在机架中?因为直到applicaton_controller中的after_action
头才出现。domain
进行设置?我还在生产中使用了安全的httponly cookie,但在开发中仅使用了httponly。我在这里想念什么?我花了几天时间寻找问题,但找不到解决方法。任何线索都将非常有帮助。谢谢
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
)
我观察到一件事。如果我在Cookie中设置了secure: false
,那么它将在生产环境中起作用,但在secure: true
中则无效。另一方面,secure: true
在生产中与response.set_cookie一起使用。
我的request.protocol是HTTP。如果请求协议为HTTP并且配置了secure: true
选项,ActionDispatch :: Cookies是否可能甚至不设置cookie。
但是我认为secure: true
是针对客户端的。就像cookie是安全的一样,浏览器将仅通过https协议发送它。我想念什么?
答案 0 :(得分:0)
我有这种行为的原因。实际上,其他团队在生产中部署了application gateway
。这导致Rails服务器收到最初为HTTPS的HTTP请求。
现在,由于我已将cookie标记为secure: true
,如果协议是HTTP,则看起来ActionDispatch :: Cookies甚至不发送cookie来响应请求。仅当协议为HTTPS时才发送。如果我通过secure: false
禁用了安全性,那么它将起作用,或者如果我禁用了应用程序网关,则它将与ActionDispatch :: Cookie一起使用。
secure
是一个客户端属性,这似乎很奇怪,但是从ActionDispatch :: Cookies的行为来看,如果协议为HTTP并且将安全性设置为true,它甚至不从服务器发送cookie。 / p>
尽管我没有找到有关此行为的任何文档,但这是它的工作方式。