gpt4 book ai didi

ruby-on-rails - ActionDispatch::Cookies 没有跨域设置

转载 作者:数据小太阳 更新时间:2023-10-29 08:06:38 25 4
gpt4 key购买 nike

我有一个与后端 Rails API 交互的前端 React SPA。在生产中,前端有一个域名 mysecretsite.com,而后端与 mysecretsite.io

相关联

我正在使用 ActionDispatch::Cookies在浏览器中设置访问 token ,以便用户可以使用该 token 进行后续请求。

cookies.signed[:access_token] = { value: 'tmp_token_string', httponly: true, domain: :all }

当 React SPA 和 Rails API 都在一台计算机上进行本地开发时,它会按预期工作。

当我分别在不同的服务器上部署 React SPA 和 Rails API 后,我发现浏览器中的 cookie 设置不正确。

我可以在开发模式下重现此类问题,我将 React SPA 放在同一局域网内的另一台计算机上。

我曾尝试配置 ActionDispatch::Cookies用于开发环境的 domain 和 React SPA 的 IP:Port 字符串等参数,或用于生产环境的 %w(.mysecretsite.com .mysecretsite.io)环境,或者只是 nil,但它没有改变任何东西。

我的 cookie 设置中可能遗漏了什么?

Controller /application_controller.rb

class ApplicationController < ActionController::API
include ActionController::Cookies
end

配置/应用程序.rb

module RailsApp
class Application < Rails::Application
config.load_defaults 5.2
config.api_only = true

config.middleware.use ActionDispatch::Cookies
end
end

24 小时后,我有一些额外的信息:

我查看了 Chrome 浏览器的响应 header 。在与 Rails API 运行在同一台计算机上的 React SPA 中,正确设置了 access_token cookie。这是响应 header :

Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD
Access-Control-Allow-Origin: http://192.168.12.40:27511
Access-Control-Expose-Headers:
Access-Control-Max-Age: 1728000
Cache-Control: max-age=0, private, must-revalidate
Content-Type: application/json; charset=utf-8
ETag: W/"ebd48cd3b0ac4fa7ba23a4d40b8508a2"
Vary: Origin
X-Request-Id: 9aa588f0-8569-b1ca-901945962e87
X-Runtime: 0.064807

当 React SPA 在同一 LAN 内的另一台计算机上运行时,access_token cookie 未设置,就像生产中发生的那样。这是响应 header :

Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD
Access-Control-Allow-Origin: http://192.168.12.50:27511
Access-Control-Expose-Headers:
Access-Control-Max-Age: 1728000
Cache-Control: max-age=0, private, must-revalidate
Content-Type: application/json; charset=utf-8
ETag: W/"ebd48cd3b0ac4fa7ba23a4d40b8508a2"
Vary: Origin
X-Request-Id: 9aa588f0-8569-b1ca-901945962e87
X-Runtime: 0.059074

在这两种情况下,Set-Cookie header 都丢失了,但是其中一个成功设置了 cookie,而另一个失败了。

最佳答案

我自己解决了这个问题。我无法将 .com 域分配给 React API,同时将 .io 域与 Rails API 关联。

问题是

You would need to have at least two levels of the domain to be the same in order to use cookies

Cookies across multiple TLDs? 中所述

在开发环境中,当 React SPA 和 Rails API 在不同主机上运行时,我的解决方法是分别为两个应用程序分配一个公共(public)本地域名。

首先,编辑 /etc/hosts 如下:

192.168.12.40   mydevsite.com
192.168.12.10 api.mydevsite.com

其次,在 Rails API 应用程序中,将 mydevsite.com:27511 作为附加源添加到文件 config/initializers/cors.rb。并重启 Rails API 生效。

最后,更新React SPA和浏览器中的相关请求URL。


24 小时后

我可以确认这个问题在生产环境中也得到了解决,其中 Rails API 配置了一个新的域名 api.mysecretsite.com

但是,我仍然不知道为什么the official documentation有一个设置示例 domain: %w(.example.com .example.org),以及它们呈现的用例类型。

关于ruby-on-rails - ActionDispatch::Cookies 没有跨域设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56911413/

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