【问题标题】:CORS origin problems while setting origin to '*' with cookies使用 cookie 将原点设置为“*”时出现 CORS 原点问题
【发布时间】:2022-01-06 16:15:32
【问题描述】:

我正在开发一个带有 nodejs/express 后端的 reactjs 前端应用程序。 之前,反应方面,我通过地址localhost:5000 访问我的nodejs,但由于我想从我的移动设备上尝试它,我天真地将localhost 更改为我的@ip 192.168.X.X,正如标题所说,它不起作用。

我正在分享一个我尝试使用 login 功能的示例,因为服务器应该发回一个 cookie。

前端我用axios:

const result = await axios({
                method:'post',
                url:'http://192.168.X.X:5000/api/user/login',
                data:{
                    "emailLogin":login,
                    "password":password
                },
                withCredentials:true,
                headers: { crossDomain: true, 'Content-Type': 'application/json' },
            });

后端我试过这个:

const corsConfig = {
    credentials:true,
    origin:true,
}
app.use(cors(corsConfig));

第一个配置给我发回一个 200 个 http 代码,但没有任何 cookie。

我也试过这个作为后端:

const corsConfig = {
    credentials:true,
    origin:"*",
}
app.use(cors(corsConfig));

这一次,在前端,我得到了众所周知的 Access to XMLHttpRequest 错误。

我在 stackoverflow 的某处读到,当 origin 设置为 '*' credential 应该设置为 false

我也很想拥有一份关于 cors、react 和 nodejs 的完整文档,但老实说,我找不到任何可以解决我的问题的文档。

总结一下我的问题:

我的 reactjs 前端将部署在多个地址未知的设备上,它应该向 nodejs 后端发送一个 POST 请求,该后端将发回一个 cookie。

【问题讨论】:

  • 抱歉,在意识到我错过了您问题的中间部分后,我删除了我的答案,而且您已经尝试了我所建议的内容。这可能是您正在寻找的文档npmjs.com/package/cors
  • 我建议您尝试一次,将您当前的客户端地址硬编码到服务器 cors 代码中,如此处 stackoverflow.com/questions/19743396/… 建议的那样,在您知道可行之后,弄清楚下一步该做什么
  • 我可以知道您的前端和后端域/IP。使用 cookie 启用 CORS 取决于这两个。如果前端和后端都在不同的域(如 client.com 和 server.com)上,则应更改 sameSite='None' 的 cookie 属性,并为您的网站使用 HTTPS。
  • 实际上,我认为我通过这个问题过度复杂了我的问题。我的服务器基于 nodejs,我的客户端应用程序是 reactjs 应用程序。假设我的服务器将托管在 myserver.com 上,而我的客户端将托管在 myclient.com 上。用户通过 myclient.com 访问我的应用程序,并通过它与 myserver.com 通信。也许我误解了 CORS 地址配置,CORS 服务器端是否应该允许来自 myclient.com 或实际用户地址的数据?对于上面的第一个示例,我可以访问我的服务器,但无法获取任何 cookie,而第二个示例,我无法访问服务器。

标签: node.js reactjs cookies cors


【解决方案1】:

我遇到了同样的问题。当我的后端是 myserver.com 而前端是 myclient.com

后端配置:

  1. 使用确切的来源而不是“*”启用 CORS

    app.use(cors({
     origin: [
       'http://localhost:4200',
       'https://dev.myclient.com',
       'https://staging.myclient.com',
       'https://www.myclient.com',
     ],
     credentials: true
    }))
    
  2. 使用 SameSite="None" 设置 Cookie 并使用 HTTPS 启用后端。

    res.cookie('access_token', token, {
     expires: new Date(Date.now() + (3600 * 1000 * 24 * 180 * 1)), //second min hour days year
     secure: true, // set to true - samesite none only works with https
     httpOnly: true, // backend only
     sameSite: 'none'
    });
    

由于您的前端和后端位于不同的域中。您必须将 sameSite 属性指定为“无”

您的后端必须启用 HTTPS,因为 samSite='none' 仅适用于 HTTPS,否则您的 cookie 将被浏览器阻止。检查 cookie link 中的 samesite 属性。

为您的后端 myserver.com 启用 SSL 证书

【讨论】:

  • 确实,我的问题出在根源上,我完全误解了原因,但是通过添加不同的地址,我可以像你一样到达我的客户,我终于可以让我的应用程序在我的所有设备上运行。非常感谢阿吉兰!我现在来看看 samesite 属性。
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2017-12-18
  • 2022-01-18
  • 1970-01-01
  • 2022-06-30
  • 2014-09-30
相关资源
最近更新 更多