【问题标题】:NodeJS App hosted on Heroku don't set client-side cookie托管在 Heroku 上的 NodeJS 应用程序不设置客户端 cookie
【发布时间】:2019-05-17 17:18:02
【问题描述】:

我的设置:

  • NodeJS 服务器(托管在 Heroku 上)
  • Progressive-Web-App(托管在 Firebase 上)

当我在本地主机上安装应用程序和服务器时,一切正常。但由于我将它托管在这些平台上,因此不再设置客户端 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 应用程序中发出请求的文件)

      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 中使用了错误的域?

谢谢!

【问题讨论】:

    标签: node.js firebase ionic-framework heroku express-session


    【解决方案1】:

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

    我现在的设置:

    • Heroku 上的 Node.Js 服务器 (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 故障排除:

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

    【讨论】:

    • 这也适用于我。但我认为我们需要设置域,因为我们有子域?如果我有 test.herokuapp.com 作为我的 url,那么我们需要设置 .herokuapp.com?
    • @Johnny88520 所以实际上你不需要设置域。我也有 .herokuapp.com,它只在我没有设置域时才对我有用。
    • 谢谢你,我的 res.clearCookie 在我删除域密钥之前无法工作,谢谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 2021-06-10
      • 1970-01-01
      • 2020-09-18
      • 2020-01-19
      • 2015-07-14
      • 1970-01-01
      • 2021-12-18
      • 2013-10-29
      相关资源
      最近更新 更多