Node.js Cookie不会保存在浏览器中

Node.js Cookie不会保存在浏览器中,node.js,angular,express,cookies,jwt,Node.js,Angular,Express,Cookies,Jwt,首先,我想说,我已经阅读了关于这个问题的几乎所有内容,到目前为止还没有解决方案 简而言之,我有一个Node.js API服务器运行在localhost:3000上。我还有一个Angular 10应用程序在localhost:4200上运行。问题很简单-我向localhost:3000/api/users/login发出请求,并收到以下信息: 但是,没有保存cookie,您可以在此处看到: 因此,每个后续请求(无论是POST还是GET)都没有标题,服务器无法识别用户。 到目前为止,我试过: 将

首先,我想说,我已经阅读了关于这个问题的几乎所有内容,到目前为止还没有解决方案

简而言之,我有一个Node.js API服务器运行在localhost:3000上。我还有一个Angular 10应用程序在localhost:4200上运行。问题很简单-我向localhost:3000/api/users/login发出请求,并收到以下信息:

但是,没有保存cookie,您可以在此处看到:

因此,每个后续请求(无论是POST还是GET)都没有标题,服务器无法识别用户。 到目前为止,我试过:

  • 将{withCredentials:true}包含到来自
  • 将cookie更改为http:false
  • 将Cookie中的域设置为各种内容,如“.app.localhost”
  • 将sameSite:“无”添加到cookie
  • 正在运行API的localhost:3000上搜索cookie
  • 将cors中的原点更改为“*”或将其完全删除
  • 在Edge中也尝试了所有这些东西(否则我使用Chrome)
不幸的是,这些东西对我都不起作用。否则登录和注册成功,我可以在mongo中看到数据

在这里,我将添加我使用的代码片段:

const app = express();
app.use(express.json());
app.use(cookieParser(config.cookieSecret));
app.use(express.static(path.resolve(__basedir, 'static')));
app.use(cors({
  origin: config.origin,
  credentials: true
}));
app.use('/api', apiRouter);
app.use(errorHandler);
这是我在其中设置cookie的登录处理程序:

async function login(req, res, next) {
const { email, password } = req.body;
try {
    let user = await User.findOne({ email });
    const match = await user.matchPassword(password);
    if (!match) {
        res.status(401)
            .send({ message: 'Wrong username or password' });
        return
    }
    user = bsonToJson(user);
    const token = utils.jwt.createToken({ id: user._id });
    if (process.env.NODE_ENV === 'production') {
        res.cookie(authCookieName, token, { httpOnly: true, sameSite: 'none', secure: true })
    } else {
        res.cookie(authCookieName, token, { httpOnly: true })
    }
    res.status(200).send(user);
} catch (err) {
    next(err);
}
}

这是有角度的部分:

loginMet(data) {
return this.http.post('http://localhost:3000/api/users/login', data, {withCredentials: true});

}

更新

经过测试,chrome(86.0.4240.198)似乎仍然允许在
localhost
上使用跨站点cookie,这意味着您的问题不是由新的限制引起的,使用
{useCresidences:true}
应该可以正常工作

首字母

对于被认为具有相同来源的两个位置,协议、域和端口必须相同。在您的情况下,您有(localhost:3000和localhost:4200)和cookies不能在Safari、Firefox和Chrome中的不同来源之间共享

你可以阅读更多关于这个主题的文章

在本地,您可以尝试通过创建proxy.config.json来解决此问题,以便webpack dev服务器充当后端的代理。因此,所有对localhost:3000的请求都将被发送到localhost:4200。你可以阅读更多关于它的内容


另一个可以在本地和生产环境下工作的解决方案(如果您不会从与API服务器相同的服务器为angular应用程序提供服务)是为各个应用程序提供一个域和两个子域。在本地,您可以通过更新来完成此操作,在生产时,当然这将由DNS服务器完成。

user1的回答部分正确

截至2020年2月,RFC 6265更改了“HTTP状态管理机制”。 cookie现在以默认值LAX存储,这将强制浏览器不向第三方提供cookie

Firefox v69和Google Chrome(大约一年后)在80版中采用了这一技术

要避免这种情况,必须在创建cookie时设置以下内容:

SameSite=无 安全=正确

注意:这些道具只能在开发模式中使用,因为它们在某种程度上使客户端暴露于漏洞

资料来源:


感谢您提供的资源,不幸的是,在src/文件夹中创建proxy.config.json并将其添加到angular.json->“architect”->“service”->“options”->“proxyConfig”之后,angular站点中编写的“src/proxy.config.json”对我不起作用。我使用了这里给出的默认配置,只是更改了目标,因为在我的例子中,API位于端口3000上。我也试过他们的,目标是3000,但还是没有成功。我的配置文件如下所示:{“/api”:{“target”:“,“secure”:false}}使用默认配置不会自动为您工作。你必须摆弄一下配置。尝试将json更改为js文件,如图所示,然后尝试或。我发现了问题所在。{withCredentials:true}由于某些原因无法与http.post一起使用。当我更改方法以同时在服务器和服务器中获取时,请求头被发送。代理帮助我。我的代理配置文件如下:{“/api”:{“target”:“,“secure”:false}}现在我的请求转到localhost:4200/api而不是localhost:3000/api,代理重定向到正确的地址。谢谢你,伙计!通常,当您拥有安全连接(HTTPS)时会使用该标志。感谢您提供的信息。当使用{withCredentials:true}时,问题确实得到了解决。我不知道为什么我第一次尝试时它不起作用。没有对代码进行进一步更改。