托管在 Heroku 上的 NodeJS 应用程序不设置客户端 cookie

NodeJS App hosted on Heroku don't set client-side cookie

我的设置:

当我在本地主机上安装应用程序和服务器时,一切正常。但由于我将其托管在这些平台上,因此不再设置客户端 Cookie。

Server.js托管在 Heroku

var express = require("express");
var bodyParser = require("body-parser");
var logger = require("morgan");
var methodOverride = require("method-override");
var cors = require("cors");
var cookieParser = require("cookie-parser");
var session = require("express-session");
var bcrypt = require("bcrypt-nodejs");

var appURL = "https://xxxxxxxxxxxxx.firebaseapp.com";

var app = express();
app.use(logger("dev"));
app.use(bodyParser.json());
app.use(methodOverride());

app.use(cors({origin: appURL, credentials: true, methods: "GET,POST"}));
app.use(cookieParser());

app.all('*', function(req, res, next) {

    res.setHeader("Access-Control-Allow-Origin", appURL);
    res.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
    res.setHeader("Access-Control-Allow-Credentials", true);
    next();
});

app.set("trust proxy",1);

app.use(session({
    name: "random_session",
    secret: "yryGGeugidx34otGDuSF5sD9R8g0Gü3r8",
    resave: false,
    saveUninitialized: true,
    cookie: {
        path: "/",
        secure: true,
        domain: ".firebaseapp.com",
        httpOnly: true
    }
}));

Login.ts(我在 firebase App 中发出请求的文件)

      let data = {
        email: this.loginField,
        password: this.passwordField
      }

      var xhr = new XMLHttpRequest();
      xhr.open("POST","https://xxxxxxxxxx.herokuapp.com/login", true);
      xhr.withCredentials = true;

      var change = () => {
        if(xhr.readyState == XMLHttpRequest.DONE) {

          if(xhr.status != 0) {

            if (xhr.status != 401 && xhr.status != 404) {

              //Login Successfull

            } else {
            //Login Fail
            }

          } else {
            //Network error
          }

        }
      }

      xhr.onreadystatechange = change;

      xhr.setRequestHeader("Access-Control-Allow-Origin","https://xxxxxxxxxx.firebaseapp.com");
      xhr.setRequestHeader("Access-Control-Allow-Credentials", "true");
      xhr.setRequestHeader("Content-Type", "application/json");

      xhr.send(JSON.stringify(data));

问题:

它没有在客户端设置 cookie,我做错了什么?我是在 Cookie 中使用了错误的域还是在 Access-Control-Allow-Origin 中使用了错误的域?

谢谢!

我解决了我的问题:我从 Firebase 中删除了我的 Ionic 应用程序,现在我也在 Heroku 上托管它。这并没有解决问题。我的浏览器中仍未设置 cookie。

我现在的设置:

  • Node.Js Heroku 上的服务器 (xxxxxx.herokuapp.com)
  • Heroku 上的 Ionic-PWA (yyyyyy.herokuapp.com)

在我的 Node.js 中,我刚刚 删除了域 :

app.use(session({
    name: "random_session",
    secret: "yryGGeugidx34otGDuSF5sD9R8g0Gü3r8",
    resave: false,
    saveUninitialized: true,
    cookie: {
        path: "/",
        secure: true,
        //domain: ".herokuapp.com", REMOVE THIS HELPED ME (I dont use a domain anymore)
        httpOnly: true
    }
}));

删除域 解决了我的问题。

iOS-故障排除:

如果您在 Heroku 上托管您的 NodeJS 服务器并将您的 PWA 也托管在 Heroku 上,您需要在 Safari 设置中禁用 Prevent Cross-Site Tracking

对我来说,添加 sameSite = 'none';在 cookie 对象中工作。