You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Heroku部署的Node.js+Passport.js应用仅开发PC可登录问题

问题:Heroku部署应用后跨设备登录失败

我在Heroku上部署了一个应用,开发环境及我的PC上访问均正常,但其他设备无法完成登录操作。所有设备均可向MongoDB Atlas提交数据,说明数据库连接正常且能接收信息。参考类似问题的解决方案,提示可能存在客户端API调用指向localhost的问题,但我不清楚具体修复方式。

更新说明:注释掉Session配置中的"secure: true"后,曾短暂实现用户注册及登录功能,但目前该方法已失效。

应用代码片段

Session初始化

// Init Session
app.use(
  session({
    secret: process.env.SESSION_SECRET,
    resave: true,
    saveUninitialized: true,
    proxy: true, // add this line
    cookie: {
      //secure: true, It worked for a short time when I commented this out
      httpOnly: true,
    },
    store: new MongoStore({ mongooseConnection: mongoose.connection }),
  })
);

// For Passport JS Authentication
app.use(passport.initialize());
app.use(passport.session());
require("./utils/passport.auth");

app.use((req, res, next) => {
  res.locals.user = req.user;
  next();
});

Passport认证配置(passport.auth)

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/user.model');

passport.use(
  new LocalStrategy(
    {
      usernameField: 'email',
      passwordField: 'password',
    },
    async (email, password, done) => {
      try {
        const user = await User.findOne({ email });
        // Username/email does NOT exist
        if (!user) {
          return done(null, false, {
            message: 'Username/email not registered',
          });
        }
        // Email exist and now we need to verify the password
        const isMatch = await user.isValidPassword(password);
        return isMatch
          ? done(null, user)
          : done(null, false, { message: 'Incorrect password' });
      } catch (error) {
        done(error);
      }
    }
  )
);

passport.serializeUser(function (user, done) {
  done(null, user.id);
});

passport.deserializeUser(function (id, done) {
  User.findById(id, function (err, user) {
    done(err, user);
  });
});

认证路由(auth.route.js)

router.get(
  "/login",
  ensureLoggedOut({ redirectTo: "/" }),
  async (req, res, next) => {
    try {
      return res.render("login");
    } catch (e) {
      console.log("e", e);
    }
  }
); 
router.post(
  "/login",
  passport.authenticate("local", {
    failureRedirect: "/auth/login",
    failureFlash: true,
  }),
  async (req, res) => {
    try {
      res.redirect(`/`);
    } catch (e) {
      console.log("e", e);
    }
  }
);

内容的提问来源于stack exchange,提问作者Christopher Jung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:24:28