部署到 Heroku 时,Passport req.isAuthenticated() 始终为 false

Passport req.isAuthenticated() always false when deployed to Heroku

我正在使用 passportNodejs。当我在我的本地主机上 运行 时,我的应用程序按预期工作。但是,当我部署到 Heroku 时,我发现 req.isAthenticated() 函数 return 为假,而它应该 return 为真,即使 passport 正在寻找并验证用户和密码。这是我的代码,它初始化 express-sessionpassport:

app.use(cookieParser());
app.use(session({
  secret: 'foo',
  resave: true,
  saveUninitialized: true,
  cookie: {
    secure: true,
    maxAge: 3600000
    //maxAge: new Date(Date.now() + 3600000)
  }
}));

app.use(flash());
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions

这里是我定义本地护照的方式:

module.exports = function(passport, configIds) {
    passport.use('login', new LocalStrategy({
      usernameField: "email",
      passwordField: "password",
      passReqToCallback: true
    },
        function(req, email, password, cb) {
            //console.log('got email pwd: ' + email + ' ' + password);
        User.getByEmail(email, function(err, user) {
            if (err) { 
                console.log('something went wrong in login strategy getting user: ' + err);
                return cb(err); 
            }
            if (!user) { 
                console.log('problem with user in local strategy');
                return cb(null, false, { message: 'cannot locate user'}); 
            }
            if (!User.comparePassword(user, password)) { 
            console.log('incorrect password for user');
                return cb(null, false, { message: 'incorrect email or password'}); 
            }
          console.log('success: return the user');
            return cb(null, user);
        });
        }
    )),

我正在到达 success: return the user 控制台输出,当我在本地主机上 运行 时,req.isAuthenticated() 函数 return 再次为真,正如预期的那样。我看到了一些关于使用 https 的评论,但我在 localhost 和 Heroku 上都使用了安全套接字。这是我定义的中间件,用于检查请求是否已通过身份验证...

// route middleware to make sure a user is logged in
function isLoggedIn(req, res, next) {

    // if user is authenticated in the session, carry on 
    if (req.isAuthenticated()) {
        next();
    } else {
        // if they aren't redirect them to the home page
        //return res.redirect('/');
        console.log('User not authenticated. Redirect to home');
        return res.status(401).redirect('/');
    }
}   

编辑: 我还检查了正在存储哪些 cookie。我可以看到,当 运行ning 作为本地主机存储会话 cookie 但 运行ning 来自 Heroku 时,不存在 cookie。

任何人都可以建议为什么这会起作用,运行ning 在本地主机上,但在 运行ning 在 Heroku 上中断?

好的,这现在可以工作了,似乎是因为代理配置没有正确设置,正如程序员在其中一条评论中所建议的那样(谢谢!)。请参阅下面修复问题的修改后的代码...

app.use(cookieParser());
app.enable('trust proxy'); // add this line
app.use(session({
  secret: 'secret',
  resave: true,
  saveUninitialized: true,
  proxy: true, // add this line
  cookie: {
    secure: true,
    maxAge: 3600000,
    store: new MongoStore({ url: config.DB_URL })
  }
}));

我还按照 robertklep 的建议添加了一个 MongoStore 来保存会话。希望这对面临同样问题的任何人都有帮助。