好吧,我已经调查了几天了,我真的不知道问题是什么。出于某种原因,身份验证失败(实际上,passportjs认为它失败了),但在我看来,一切正常。当我登录时,它会调用failureredirect url。但是当我打印出req.user对象的值时,一切都是正确的。
情况:
我在/login处有一个登录表单,其中显示了两个字段,一个用于电子邮件地址,另一个用于密码。
这是Express的设置:
var app = express();
app.configure(function () {
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.session({secret: 'Idioticlargesecretekeygoeshere.'}));
app.use(express.static(path.join(__dirname, 'public')));
// Initialize passport
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
});
这就是我如何配置Passport(在初始化Express之前添加到app.js中):
passport.serializeUser(function (user, fn) {
fn(null, user.id);
});
passport.deserializeUser(function (userId, fn) {
User.get(userId, function (err, user) {
fn(err, user);
});
});
passport.use(User.passwordStrategy);
这是user.passwordstrategy-method:
User.passwordStrategy = new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
},
function (username, password, fn) {
User.authenticate(username, password, function (err, user) {
if(err) return fn(err);
if(user) {
fn(null, user);
}
fn(null, null);
});
}
);
这是路由线路:
app.post('/login', passport.authenticate('local', {successRedirect: '/', failureRedirect: '/login', failureFlash: true}));
我已经测试和调试了身份验证方法,它是有效的。如果尝试登录,则输入serializeuser方法,并正确填写id。但是,由于登录不起作用,因此有些东西失败了。有人能给我一些指导吗?因为我已经尝试了我能想到的一切。我看不出我的代码和passportjs.org网站上发布的代码有什么不同。
用户数据存储在redis btw中。检索数据不是问题,因为所有正确的数据都传递给序列化方法。但是由于某种原因,在这条线路的某个地方,没有检测到正确的登录名。
我在passportjs站点上试过这个例子,而且这个例子运行正确。
最佳答案
如果fn
是trueish,则您的代码将调用user
两次,因此添加return
可以解决此问题:
if (user) {
return fn(null, user);
}
fn(null, null);