部署到 Heroku 时,Passport req.isAuthenticated() 始终为 false
Passport req.isAuthenticated() always false when deployed to Heroku
我正在使用 passport
和 Nodejs
。当我在我的本地主机上 运行 时,我的应用程序按预期工作。但是,当我部署到 Heroku 时,我发现 req.isAthenticated()
函数 return 为假,而它应该 return 为真,即使 passport 正在寻找并验证用户和密码。这是我的代码,它初始化 express-session
和 passport
:
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 来保存会话。希望这对面临同样问题的任何人都有帮助。
我正在使用 passport
和 Nodejs
。当我在我的本地主机上 运行 时,我的应用程序按预期工作。但是,当我部署到 Heroku 时,我发现 req.isAthenticated()
函数 return 为假,而它应该 return 为真,即使 passport 正在寻找并验证用户和密码。这是我的代码,它初始化 express-session
和 passport
:
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 来保存会话。希望这对面临同样问题的任何人都有帮助。