Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Express未在生产中设置HTTPOnly cookie_Node.js_Express_Firebase Authentication_Google Cloud Functions_Session Cookies - Fatal编程技术网

Node.js Express未在生产中设置HTTPOnly cookie

Node.js Express未在生产中设置HTTPOnly cookie,node.js,express,firebase-authentication,google-cloud-functions,session-cookies,Node.js,Express,Firebase Authentication,Google Cloud Functions,Session Cookies,我正在使用firebase和会话Cookie对我的react网站上的用户进行身份验证。后端使用谷歌云功能。当我在本地主机上登录我的网站时,一切正常;我的react应用程序在localhost:3000上运行,我的云功能在locahost:5000上运行。我的初始化代码如下所示: app.use(cors({credentials: true, origin: ['http://localhost:3000', 'https://beta.example.com','https://example

我正在使用firebase和会话Cookie对我的react网站上的用户进行身份验证。后端使用谷歌云功能。当我在本地主机上登录我的网站时,一切正常;我的react应用程序在
localhost:3000
上运行,我的云功能在
locahost: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" });
    });
};
登录代码如下所示:

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。我尝试使用axios和fetch处理请求,它们都在本地主机上工作。以下是从我的前端获取的信息:

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,它是按它应该的方式创建的;当我按下网站上的登录按钮时。在我的自定义域上按相同的登录按钮时,此cookies不存在

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

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

这就是原因。在本地上工作时,前端和后端api都属于本地主机域

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

是的,这也是我在帖子中说的,问题是跨域Cookie。如果在不同的域上部署前端和后端,则无法解决此问题。如果您仍然想使用cookies,常用的方法是通过/api这样的子路由向后端创建代理,但这应该是另一个主题。