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

标签 ruby-on-rails ruby cookies ruby-on-rails-5

我有一个前端 React SPA 与后端 Rails API 交互。在生产中,前端有一个域名 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 放置在同一 LAN 内的另一台计算机上。

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

我的 Cookie 设置中可能会遗漏什么?

Controller /application_controller.rb

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

配置/application.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有一个设置示例域:%w(.example.com .example.org),以及它们呈现的用例类型。

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

相关文章:

ruby-on-rails - 捆绑 geoip-c - 给出错误 "you must have geoip c library installed"

ruby-on-rails - 使用基类与基模块重构 ActiveRecord 模型

html - 在 IE 中清空 IMG SRC 触发注销

ruby-on-rails - 'cucumber' 可以运行我的 rspec-on-rails 测试吗?

ruby-on-rails - Rails 中的多个 token 和多个提供者身份验证

ruby ::Mechanize::cookie_jar

Javascript - 设置浏览器 Cookie

java - 使用 crawler4j 发送请求中的 cookie?

ruby-on-rails - 在 Rails 4 中创建到外部 URL 的 Rails 路由

ruby - 使用标准库仅提取 Ruby 中正则表达式的第二个匹配项