我正在设置React SPA(www.mysite.com)和Rails API(api.mysite.com)应用程序。当我使用相同的URL名称时,一切都按预期工作,但是,当URL名称不同时,Web浏览器未设置站点cookie。由于缺少Cookie,CSRF验证当然也会失败。因此,例如,如果SPA App完全可以运行,localhost
而Rails API Applocalhost:3000
都可以正常运行,则问题仅出在我使用预期的DNS名称时。
听起来像是CORS的问题,但现在很多天都找不到了……
这是我的配置:
我正在使用rack-cors
Ruby宝石的Rails方面
config / initializers / cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins 'localhost’, 'www.mysite.com',
resource '*',
headers: :any,
credentials: true,
methods: [:get, :post, :put, :patch, :delete, :options, :head]
end
end
Rails.application.config.action_controller.forgery_protection_origin_check = false
在React端,我的axios
配置如下:
src / App.js
axios.defaults.xsrfCookieName = "CSRF-TOKEN";
axios.defaults.xsrfHeaderName = "X-CSRF-Token";
axios.defaults.withCredentials = true;
当React App启动时,它GET
向API后端发出请求以获取CSRF令牌供以后使用。同时,浏览器应该设置站点cookie。
axios
.get("/sessions/csrf_token", {
headers: { "Content-Type": "application/json"
},
})
.then(response => {
// do stuff
});
});
在设置和缺少站点cookie的两种情况下,响应标头看起来都相同
我还可以看到Cookie已发送到浏览器,但在Cookie部分下却丢失了
非常感谢您对我在这里可能缺少的任何想法!!!谢谢!!
更新:
我还应该提到我的会话配置文件设置为允许子域
config / initializers / session_store.rb
Rails.application.config.session_store :cookie_store, key: '_mysite_session', expire_after: 8.hours, domain: :all, tld_length: 2
Cookies配置可能有其他问题,但我无法弄清楚在哪里查看以及应检查哪些其他设置。
这是当我使用localhost
Cookie并按预期方式将cookie保留在浏览器中时的Cookie窗格的屏幕截图:
当我使用www.mysite.com
和api.mysite.com
名称时,右边的窗格只是空白。
我一直在研究,我认为这可能与您所看到的有关:
显然,如果您未在set-cookie
标头中指定域,则该cookie被视为“仅主机”。因此,您可能必须使它看起来像:
Set-Cookie: name=value; domain=mydomain.com
我确定这对Axios是可行的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句