我无法让Passport对我的用户进行身份验证。由于某种原因,passport.authenticate方法总是失败。我不明白的是,如果我在护照呼叫之前添加中间件,则可以通过req.user
访问用户数据。
为什么passport.authenticate失败的任何想法?
app.get('/app'
// MY USER SHOWS UP HERE
, function(req, res, next) {
console.log("app.get('/app')", req.user);
next();
}
// DOESN'T MAKE IT PAST HERE
, passport.authenticate('local', { failureRedirect: '/login', failureFlash: true })
// NEVER MAKES IT HERE
, function(req, res) {
console.log('FTW!!!');
res.render('../../client/app/app')
}
);
验证码
passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' },
function(email, password, done) {
console.log("Authenticating user: ", email, password);
User.findOne({ email: email }, function (err, user) {
if (err) return done(err);
if (!user) return done(null, false, { message: 'Invalid Email' });
return user.authenticate(password, function(err, valid) {
if (err) return done(err);
if (!valid) return done(null, false, { message: 'Invalid Password' });
return done(null, user);
});
});
}
));
passport.serializeUser(function(user, done) {
console.log('Serializing: ', user);
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
console.log('Deserializing: ', id);
User.findById(id, function (err, user) {
done(err, user);
});
});
注册和重定向:注意找到用户后的['Missing Credentials']消息
// SIGN UP
Authenticating user: cacky23@acme.org.com foobar
User.authenticate(): Comparing... // user.authenticate()
Compare Complete... true // bcrypt compare
Serializing: { email: 'cacky23@acme.org.com',
password: '$2a$10$TJcvr4wtgs6DFaNnyQSLt.v5GLbt8PIi.oOlgqZpvghveKEPEcroW',
_id: 52160e247d0aa8e328000001,
__v: 0,
createdAt: Thu Aug 22 2013 07:12:04 GMT-0600 (MDT) }
POST /users 302 185ms - 64b
Deserializing: 52160e247d0aa8e328000001
Found User: { email: 'cacky23@acme.org.com',
password: '$2a$10$TJcvr4wtgs6DFaNnyQSLt.v5GLbt8PIi.oOlgqZpvghveKEPEcroW',
_id: 52160e247d0aa8e328000001,
__v: 0,
createdAt: Thu Aug 22 2013 07:12:04 GMT-0600 (MDT) }
// MY TEST MIDDLEWARE
app.get('/app') { email: 'cacky23@acme.org.com',
password: '$2a$10$TJcvr4wtgs6DFaNnyQSLt.v5GLbt8PIi.oOlgqZpvghveKEPEcroW',
_id: 52160e247d0aa8e328000001,
__v: 0,
createdAt: Thu Aug 22 2013 07:12:04 GMT-0600 (MDT) }
GET /app 302 6ms - 68b
Deserializing: 52160e247d0aa8e328000001
Found User: { email: 'cacky23@acme.org.com',
password: '$2a$10$TJcvr4wtgs6DFaNnyQSLt.v5GLbt8PIi.oOlgqZpvghveKEPEcroW',
_id: 52160e247d0aa8e328000001,
__v: 0,
createdAt: Thu Aug 22 2013 07:12:04 GMT-0600 (MDT) }
[ 'Missing credentials' ]
GET /login 200 85ms - 3.65kb
答案 0 :(得分:3)
护照验证如何失败?它会引发错误,还是应用程序崩溃?
尝试使用req.isAuthenticated()检查用户是否已登录。 我只在登录时使用passport.authenticate在http post请求中提供登录凭据。
所以on / app仅使用
if(req.isAuthenticated()) {
console.log('user logged in', req.user);
next();
}
else {
console.log('user not logged in');
}
在/ app / login上,您可以使用已有的代码。 现在你可能已经登录了。尝试删除cookie。之后,它可能不再在console.log(req.user)上记录用户对象。
除此之外,所有代码看起来都是正确的。因此,如果无法正常工作,请尝试删除代码。 我们不知道你在user.authenticate中有什么代码。这个功能有用吗?
此致