首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActionDispatch:Cookie不跨域设置

ActionDispatch:Cookie不跨域设置
EN

Stack Overflow用户
提问于 2019-07-06 05:16:13
回答 1查看 485关注 0票数 2

我有一个前端反应SPA与后端Rails API交互。在生产中,前端有一个域名mysecretsite.com,而后端与mysecretsite.io相关联。

我使用行动调度:Cookies在浏览器中设置访问令牌,以便用户可以使用该令牌进行后续请求。

代码语言:javascript
复制
cookies.signed[:access_token] = { value: 'tmp_token_string', httponly: true, domain: :all }

当React和Rails API都在一台计算机上的本地开发中运行时,它就像预期的那样工作。

在不同的服务器上分别部署了respectively和Rails API之后,我注意到在浏览器中没有正确地设置cookie。

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

我曾经尝试过配置行动调度:Cookies参数,比如使用React的IP:Port字符串来配置开发环境,或者为生产环境配置%w(.mysecretsite.com .mysecretsite.io),或者仅仅配置nil,但是它没有改变任何东西。

在我的饼干设置中有什么可以错过的?

控制器/应用程序控制器

代码语言:javascript
复制
class ApplicationController < ActionController::API
    include ActionController::Cookies
end

config/application.rb

代码语言:javascript
复制
module RailsApp
   class Application < Rails::Application
       config.load_defaults 5.2
       config.api_only = true

       config.middleware.use ActionDispatch::Cookies
   end
end

24小时后,我有一些补充信息:

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

代码语言:javascript
复制
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时,没有设置access_token cookie,就像在生产中所发生的那样。下面是响应头:

代码语言:javascript
复制
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头,但是其中一个成功地设置了cookie,而另一个失败了。

EN

回答 1

Stack Overflow用户

发布于 2019-07-08 09:52:36

我自己解决了这个问题。我只是不能将.com域分配给React,而将.io域与Rails API相关联。

问题是

您需要至少有两个级别的域才能使用cookie。

正如跨越多个TLD的曲奇?中提到的

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

首先,将/etc/hosts编辑为如下所示:

代码语言:javascript
复制
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和浏览器中更新相关的请求URL。

24小时后

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

但是,我仍然不知道为什么正式文件有一个设置示例domain: %w(.example.com .example.org),以及它们呈现的是什么样的用例。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56911413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档