【发布时间】:2014-03-17 15:09:11
【问题描述】:
我的护照本地策略设置如下,任何一个失败案例都可以正常工作。但是,在我验证服务器日志“d1”然后挂起的情况下,请求仍处于“待处理”状态:
passport.use(
new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
},
function(email, password, done) {
User.getUser(email, password).then(function(users){
if(users && users.length == 1) {
console.log('d1')
return done(null,users[0]) ;
} else {
console.log('d2')
return done(null, false, { message: 'Incorrect credentials.' });
}
}, function(e){
console.log('d3')
return done(null, false, { message: 'Incorrect credentials.' });
});
})
);
passport.serializeUser(function(user, done) {
console.log('s1')
done(null, user);
});
passport.deserializeUser(function(user, done) {
console.log('s2')
done(null, user);
});
server.post(authPostRoute
, passport.authenticate('local',{
successRedirect : "/ideas",
failureRedirect : "/",
})
);
理想情况下,我不想在成功/失败时重定向,而是将一些 JSON 返回到浏览器。但我似乎无法让这个简单的场景发挥作用。
更新 - 追踪到 passport-local/strategy.js
上面完成的是来自 strategy.js 的这个函数
function verified(err, user, info) {
if (err) { return self.error(err); }
if (!user) { return self.fail(info); }
//console.log(self.success.toString())
self.success(user, info);
}
这一切都很好。 self.success 似乎是一个有效的函数,但它没有被调用,据我所知。
更新二: passport/authenticate.js
看起来success是一个在passport/authenticate.js中定义的函数
strategy.success = function(user, info) {
}
我好像明白了
req.logIn(user, options, function(err) {
但从不进入函数。我是否缺少登录的定义?
更新三:登录
追踪到 passport/http/prequest.js,这行显然是导致问题的原因
if (!this._passport) throw new Error('passport.initialize() middleware not in use');
虽然我以为我是这样启用的:
server.use(passport.initialize());
编辑更新 IV: 移动 passport.initialize
我在流程中较早地移动了护照初始化,现在成功和错误重定向似乎有效。
但我仍然无法控制对客户端的响应。我不想重定向。这是一个不同的问题吗?
【问题讨论】:
-
我假设您已经检查过了,但是在
.then成功函数中返回的users变量真的是一个数组吗?getUser听起来它会返回一个对象。那么也许users[0]失败了?
标签: node.js express passport.js