首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Heroku上托管的NodeJS应用程序不设置客户端cookie

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

Stack Overflow用户
提问于 2018-12-17 10:45:11
回答 2查看 5.1K关注 0票数 0

我的设置:

  • NodeJS服务器(托管在Heroku上)
  • 渐进-Web(托管在Firebase上)

当我将App放在本地主机上时,一切都很好。但是既然我把它放在这些平台上,客户端的Cookie就不再设置了。

Server.js (托管于Heroku)

代码语言:javascript
复制
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中提出请求的文件)

代码语言:javascript
复制
      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中使用了错误的域,还是在访问控制允许来源中使用了错误的域?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-21 06:35:29

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

我现在的设置:

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

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

代码语言:javascript
复制
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服务器,在Heroku上也承载PWA,则需要在Settings中禁用 Prevent Cross-Site Tracking

票数 5
EN

Stack Overflow用户

发布于 2021-03-03 17:46:56

对于我来说,在cookie对象中添加sameSite = 'none';有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53813544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档