问题描述
我从关于护照的 odin 项目中学习了一个教程,它奏效了,所以我决定实施我在自己的项目中学到的东西,他们和我的不同之处在于我遵循了一种设计模式,而他们没有,而我似乎无法找到为什么它没有响应的问题。 在我的登录页面中,我使用了电子邮件和密码,并且多次尝试更改以下代码。
这是控制器.js
//passport functions
passport.use(
new LocalStrategy((username,password,done) => {
User.findOne({ username: username },(err,user) => {
console.log(user)
if (err) {
return done(err);
};
if (!user) {
return done(null,false,{ msg: "Incorrect username" });
}
if (user.password !== password) {
return done(null,{ msg: "Incorrect password" });
}
return done(null,user);
});
})
);
passport.serializeUser(function(user,done) {
done(null,user.id);
});
passport.deserializeUser(function(id,done) {
User.findById(id,function(err,user) {
done(err,user);
});
});
//end ofpassport functions
app.use(session({ secret: "cats",resave: false,saveUninitialized: true }));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.urlencoded({ extended: false }));
app.use(function(req,res,next) {
res.locals.currentUser = req.user;
next();
});
然后我从 routes.js 调用控制器以对用户进行身份验证,但它一直失败并默认失败重定向
app.post('/signin',passport.authenticate("local",{
successRedirect:"/",failureRedirect:'/signup'}))
解决方法
默认情况下,LocalStrategy 希望在名为 username 和 password 的参数中找到凭据。如果您的站点更喜欢以不同方式命名这些字段,则可以使用选项来更改默认值。
req.body
中的参数名称应与自定义字段匹配,并且当存在空字段 usernameField
和 passwordField
时不调用 LocalStrategy
const customFields = {
usernameField : "email",passwordField : "password"
}
passport.use(
new LocalStrategy(customFields,(username,password,done) => {
User.findOne({ username: username },(err,user) => {
console.log(user)
if (err) {
return done(err);
};
if (!user) {
return done(null,false,{ msg: "Incorrect username" });
}
if (user.password !== password) {
return done(null,{ msg: "Incorrect password" });
}
return done(null,user);
});
})
);
passport.serializeUser(function(user,done) {
done(null,user.id);
});
passport.deserializeUser(function(id,done) {
User.findById(id,function(err,user) {
done(err,user);
});
});
//end ofpassport functions
app.use(session({ secret: "cats",resave: false,saveUninitialized: true }));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.urlencoded({ extended: false }));
app.use(function(req,res,next) {
res.locals.currentUser = req.user;
next();
});