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

Jon*_*han 0 heroku node.js firebase ionic-framework express-session

我的设置:

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

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

\n\n

Server.js托管在 Heroku

\n\n
var express = require("express");\nvar bodyParser = require("body-parser");\nvar logger = require("morgan");\nvar methodOverride = require("method-override");\nvar cors = require("cors");\nvar cookieParser = require("cookie-parser");\nvar session = require("express-session");\nvar bcrypt = require("bcrypt-nodejs");\n\nvar appURL = "https://xxxxxxxxxxxxx.firebaseapp.com";\n\nvar app = express();\napp.use(logger("dev"));\napp.use(bodyParser.json());\napp.use(methodOverride());\n\napp.use(cors({origin: appURL, credentials: true, methods: "GET,POST"}));\napp.use(cookieParser());\n\napp.all(\'*\', function(req, res, next) {\n\n    res.setHeader("Access-Control-Allow-Origin", appURL);\n    res.setHeader("Access-Control-Allow-Headers", "X-Requested-With");\n    res.setHeader("Access-Control-Allow-Credentials", true);\n    next();\n});\n\napp.set("trust proxy",1);\n\napp.use(session({\n    name: "random_session",\n    secret: "yryGGeugidx34otGDuSF5sD9R8g0G\xc3\xbc3r8",\n    resave: false,\n    saveUninitialized: true,\n    cookie: {\n        path: "/",\n        secure: true,\n        domain: ".firebaseapp.com",\n        httpOnly: true\n    }\n}));\n
Run Code Online (Sandbox Code Playgroud)\n\n

登录.ts(我在 firebase 应用程序中发出请求的文件)

\n\n
      let data = {\n        email: this.loginField,\n        password: this.passwordField\n      }\n\n      var xhr = new XMLHttpRequest();\n      xhr.open("POST","https://xxxxxxxxxx.herokuapp.com/login", true);\n      xhr.withCredentials = true;\n\n      var change = () => {\n        if(xhr.readyState == XMLHttpRequest.DONE) {\n\n          if(xhr.status != 0) {\n\n            if (xhr.status != 401 && xhr.status != 404) {\n\n              //Login Successfull\n\n            } else {\n            //Login Fail\n            }\n\n          } else {\n            //Network error\n          }\n\n        }\n      }\n\n      xhr.onreadystatechange = change;\n\n      xhr.setRequestHeader("Access-Control-Allow-Origin","https://xxxxxxxxxx.firebaseapp.com");\n      xhr.setRequestHeader("Access-Control-Allow-Credentials", "true");\n      xhr.setRequestHeader("Content-Type", "application/json");\n\n      xhr.send(JSON.stringify(data));\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题:

\n\n

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

\n\n

谢谢你!

\n

Jon*_*han 5

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

\n\n

我现在的设置:

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

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

\n\n
app.use(session({\n    name: "random_session",\n    secret: "yryGGeugidx34otGDuSF5sD9R8g0G\xc3\xbc3r8",\n    resave: false,\n    saveUninitialized: true,\n    cookie: {\n        path: "/",\n        secure: true,\n        //domain: ".herokuapp.com", REMOVE THIS HELPED ME (I dont use a domain anymore)\n        httpOnly: true\n    }\n}));\n
Run Code Online (Sandbox Code Playgroud)\n\n

删除域名解决了我的问题。

\n\n

iOS 故障排除:

\n\n

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

\n