当前位置: 首页 > 知识库问答 >
问题:

Express未在生产中设置HTTPOnly cookie

阴永福
2023-03-14

我正在使用firebase和会话cookies来验证react网站上的用户。后端正在使用谷歌云功能。当我在localhost上登录我的网站时,一切都很正常;我的react应用程序运行在localhost:3000上,我的云功能运行在localhost:5000上。我的初始化代码如下所示:

app.use(cors({credentials: true, origin: ['http://localhost:3000', 'https://beta.example.com','https://example.com']}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
  }));

app.use(cookieParser());

登录代码如下所示:

const idToken = req.body.idToken.toString();

  // Set session expiration to 5 days.
  const expiresIn = 60 * 60 * 24 * 5 * 1000;
  admin
    .auth()
    .createSessionCookie(idToken, { expiresIn })
    .then((sessionCookie) => {
      const options = { maxAge: expiresIn, httpOnly: true, secure: false };
      res.cookie("session", sessionCookie, options);
      return res.json({ message: "Logged in!" });
    })
    .catch((err) => {
      console.log(err);
      return res
        .status(403)
        .json({ general: "Wrong credentials, please try again" });
    });
};

问题似乎是跨域的,因为我的网站托管在另一个域,而不是谷歌云功能,我不能设置cookie无论我尝试什么。我尝试过uuse axios和fetch来执行请求,它们都在localhost上工作。下面是从我的前端获取的信息:

fetch(api_url + "/login", {
        method: "POST",
        redirect: "follow",
        credentials: "include", // Don't forget to specify this if you need cookies
        headers: headers,
        body: JSON.stringify({
          idToken: idToken,
        }),
      }).then((res) => {
        console.log("LOGGED IN!!!", res.data);
        dispatch(getuserData(true, history, url));
      });

当使用localhost时,我可以看到名为“session”的cookie,它正在按照它应该的方式创建;当我在我的网站上按下登录按钮。在我的自定义域上按相同的登录按钮时,此Cookie不存在

请注意,后端并没有崩溃,它只是由于某种原因没有将cookie保存在服务器上

共有1个答案

韦思淼
2023-03-14

Cookie不提供端口隔离。如果运行在一个端口上的服务可读取cookie,则运行在同一服务器的另一个端口上的服务也可读取该cookie。

这就是原因。当您在local上工作时,前端和后端api都属于localhost域。

在生产环境中,您可能会在不同的端点上部署前端和后端api。对于SPA应用程序,我建议使用localStorage而不是Cookies。

 类似资料:
  • 我尝试过交替cors设置,但没有成功。客户端调用使用axios,并设置了。

  • 我使用PHP-S127.0.0.1:4242命令在本地主机上为php文件启动development server。但我想,我不应该在生产中使用这个东西。目前我正在尝试在VPS上设置我的网站,我不知道如何在端口4242上永远使用ssh启动php服务器。我知道,这可能是很愚蠢的问题,这是我第一次与真正的主持工作 如有任何帮助,我将不胜感激:)

  • 我在找一个微服务协调器,遇到了优步卡登斯。我已经阅读了文档,并在开发设置中使用了它。 我对生产场景有几个问题: > 是否建议为工作流及其使用的不同活动设置一个专用的任务列表?或者,我们应该为所有人使用一个任务列表?这个决定会影响可扩展性或性能吗? 当我们添加新的工作线程计算机时,在同一台计算机中为不同的活动/工作流运行所有工作线程是否是一种常见的做法?例: 或者我们应该在专用机器中运行每个活动/工

  • proxy.conf.js在开发模式下按预期工作。 我在package.json文件中有这些文件用于启动和构建。 在我运行“NPM run Build”并使用结果文件在IIS8上托管网站后,需要使用代理设置的页面就不工作了。 例如,我的请求https://localhost/web/api/webclients/authentication应该转到https://10.109.102.109/we

  • 问题内容: 因此,当我在web.config中设置maxJsonLength时,在我的.net站点上一直显示500-Internal server error页面。 我正在修改.config,因为即使我在vb.net JavaScriptSerializer上使用MaxJsonLength = Int32.MaxValue,我仍然要为大型词典获取InvalidOperationException,