好的,我已经研究了几天了,我真的不知道问题是什么。由于某种原因,身份验证失败(实际上,Passportjs认为它失败了),但在我看来一切正常。当我登录时,它会调用failureRedirect-url。但是当我打印出req.user对象的值时,一切都是正确的。
情况: 我在/ login有一个登录表单,其中显示了2个字段,一个用于电子邮件地址,另一个用于密码。
这是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);
});
这是我配置护照的方式(在快递初始化之前添加到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网站上尝试了这个例子,并且该网站运行正常。
答案 0 :(得分:1)
如果fn
是真的,您的代码会调用user
两次,因此添加return
可能会解决此问题:
if (user) {
return fn(null, user);
}
fn(null, null);