为什么 passport.authenticate 没有来电?
Why passport.authenticate is not calling?
这是我的第一个问题,我有点厌倦了搜索...也许这是一个新手错误,但我已经尝试了一切来解决它但没有找到答案。
我像这样构建了护照新本地策略:
passport.use(new LocalStrategy({
usernameField: "username",
passwordField: "password"
}, async (username, password, done) => {
const user = await User.findOne({username: username});
if (!user) {
return done(null, false, { message: 'Este usuario no existe.' });
}
else {
const match = await user.matchPassword(password);
if(match) {
return done(null, user);
} else {
return done(null, false, { message: 'Usuario/Contraseña no correctos.' });
}
}
}));
我是这样称呼他的:
router.post("/users/login", async (req, res) => {
dni = req.body.username;
usuario = await User.findOne({username: dni});
idUser = usuario._id;
configuracion = await Config.findOne({idUsuario: idUser});
delStatus = configuracion.deleteStatus;
banStatus = configuracion.banStatus;
if(configuracion){
if(banStatus){
req.flash("errors_msg", "Su usuario se encuentra bloqueado de nuestra aplicación, contacte con soporte para más información");
res.redirect("/");
}
else if(delStatus){
req.flash("errors_msg", "Este usuario está dado de baja de nuestra plataforma, en caso de error contacte con soporte");
res.redirect("/");
}
else{
passport.authenticate("local", function (user, error, info) {
console.log("2");
console.log(info);
if(error){
console.log(error);
req.flash("errors_msg", "ERROR: Usuario o contraseña incorrectos")
res.redirect("/users/login");
}
if(!user){
req.flash("errors_msg", "ERROR: Usuario o contraseña incorrectos")
res.redirect("/users/login");
}
req.logIn(user, function (err) {
if(error){
return next(err);
}
res.redirect("/");
})
});
}
}
else{
if(usuario){
id = consultaUsuario._id;
res.redirect("/users/verify?=" + id);
}
else{
req.flash("errors_msg", "Este usuario no existe, registrese o en caso de error, consulte con nuestro servicio de atención al cliente");
res.redirect("/users/register");
}
}
});
但是 passport 无论如何都没有启动...
谁能帮帮我?提前致谢!
编辑 1:
@davidmwhynot 这是最准确的:
本地策略:
passport.use(new LocalStrategy({
usernameField: "username",
passwordField: "password",
passReqToCallback: true
}, async (res, username, password, done) => {
const user = await User.findOne({username: username});
idUsuario = user._id;
const configuracion = await Config.findOne({idUsuario: idUsuario});
if(configuracion){
if (configuracion.banStatus) {
return done(null, false, { message: "Su usuario se encuentra bloqueado de nuestra aplicación, contacte con soporte para más información"});
}
if (configuracion.deleteStatus) {
return done(null, false, { message: "Este usuario está dado de baja de nuestra plataforma, en caso de error contacte con soporte"});
}
}
if (!user) {
return done(null, false, { message: 'Este usuario no existe.' });
}
else if(!configuracion){
user.isConfig = false;
return user;
}
else {
const match = await user.matchPassword(password);
if(match) {
return done(null, user);
} else {
return done(null, false, { message: 'Usuario/Contraseña no correctos.' });
}
}
}));
这是登录代码:
router.post("/users/login", passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/users/login',
failureFlash: true
}), async (req, res) => {
// This is not executed anyway, can´t see any param or even see a
//console.log
});
我尝试了很多东西,但是...没有一个成功,甚至在 localStrategy 上尝试 passReqToCallback: true
但也没有成功
您需要将身份验证策略作为 中间件 添加到您的登录路由:
router.post(
'/users/login',
passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/users/login',
failureFlash: 'Invalid username or password.'
}),
async (req, res) => {
// now, you don't need to query the database for your user
// it should be available on the request already:
var idUser = req.user.id;
}
);
您还应该将检查用户是否被禁止的逻辑移至您的本地策略。
编辑:这是一个更新的本地策略,其中包含用于检查用户是否具有配置且未被禁止的所有逻辑。
编辑 2:
router.post(
'/users/login',
passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/users/login',
}),
async (req, res) => {
if (!req.user.configuration) {
//const id = consultaUsuario._id;
req.logOut(req.user);
const id = req.user._id;
req.user = null;
res.redirect('/users/verify?=' + id);
} else {
res.redirect('/');
}
}
);
passport.use(
new LocalStrategy(
{
usernameField: 'username',
passwordField: 'password',
},
async (username, password, done) => {
const user = await User.findOne({ username: username });
if (!user) {
return done(null, false, {
message: 'Este usuario no existe.',
});
}
const match = await user.matchPassword(password);
if (!match) {
return done(null, false, {
message: 'Usuario/Contraseña no correctos.',
});
}
const configuracion = await Config.findOne({
idUsuario: user._id,
});
if (!configuracion) {
user.configuration = false;
} else {
const delStatus = configuracion.deleteStatus;
const banStatus = configuracion.banStatus;
user.configuration = true;
if (banStatus) {
done(null, false, {
message:
'Su usuario se encuentra bloqueado de nuestra aplicación, contacte con soporte para más información',
});
} else if (delStatus) {
done(null, false, {
message:
'Este usuario está dado de baja de nuestra plataforma, en caso de error contacte con soporte',
});
}
}
done(null, user);
}
)
);
这是我的第一个问题,我有点厌倦了搜索...也许这是一个新手错误,但我已经尝试了一切来解决它但没有找到答案。
我像这样构建了护照新本地策略:
passport.use(new LocalStrategy({
usernameField: "username",
passwordField: "password"
}, async (username, password, done) => {
const user = await User.findOne({username: username});
if (!user) {
return done(null, false, { message: 'Este usuario no existe.' });
}
else {
const match = await user.matchPassword(password);
if(match) {
return done(null, user);
} else {
return done(null, false, { message: 'Usuario/Contraseña no correctos.' });
}
}
}));
我是这样称呼他的:
router.post("/users/login", async (req, res) => {
dni = req.body.username;
usuario = await User.findOne({username: dni});
idUser = usuario._id;
configuracion = await Config.findOne({idUsuario: idUser});
delStatus = configuracion.deleteStatus;
banStatus = configuracion.banStatus;
if(configuracion){
if(banStatus){
req.flash("errors_msg", "Su usuario se encuentra bloqueado de nuestra aplicación, contacte con soporte para más información");
res.redirect("/");
}
else if(delStatus){
req.flash("errors_msg", "Este usuario está dado de baja de nuestra plataforma, en caso de error contacte con soporte");
res.redirect("/");
}
else{
passport.authenticate("local", function (user, error, info) {
console.log("2");
console.log(info);
if(error){
console.log(error);
req.flash("errors_msg", "ERROR: Usuario o contraseña incorrectos")
res.redirect("/users/login");
}
if(!user){
req.flash("errors_msg", "ERROR: Usuario o contraseña incorrectos")
res.redirect("/users/login");
}
req.logIn(user, function (err) {
if(error){
return next(err);
}
res.redirect("/");
})
});
}
}
else{
if(usuario){
id = consultaUsuario._id;
res.redirect("/users/verify?=" + id);
}
else{
req.flash("errors_msg", "Este usuario no existe, registrese o en caso de error, consulte con nuestro servicio de atención al cliente");
res.redirect("/users/register");
}
}
});
但是 passport 无论如何都没有启动...
谁能帮帮我?提前致谢!
编辑 1:
@davidmwhynot 这是最准确的:
本地策略:
passport.use(new LocalStrategy({
usernameField: "username",
passwordField: "password",
passReqToCallback: true
}, async (res, username, password, done) => {
const user = await User.findOne({username: username});
idUsuario = user._id;
const configuracion = await Config.findOne({idUsuario: idUsuario});
if(configuracion){
if (configuracion.banStatus) {
return done(null, false, { message: "Su usuario se encuentra bloqueado de nuestra aplicación, contacte con soporte para más información"});
}
if (configuracion.deleteStatus) {
return done(null, false, { message: "Este usuario está dado de baja de nuestra plataforma, en caso de error contacte con soporte"});
}
}
if (!user) {
return done(null, false, { message: 'Este usuario no existe.' });
}
else if(!configuracion){
user.isConfig = false;
return user;
}
else {
const match = await user.matchPassword(password);
if(match) {
return done(null, user);
} else {
return done(null, false, { message: 'Usuario/Contraseña no correctos.' });
}
}
}));
这是登录代码:
router.post("/users/login", passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/users/login',
failureFlash: true
}), async (req, res) => {
// This is not executed anyway, can´t see any param or even see a
//console.log
});
我尝试了很多东西,但是...没有一个成功,甚至在 localStrategy 上尝试 passReqToCallback: true
但也没有成功
您需要将身份验证策略作为 中间件 添加到您的登录路由:
router.post(
'/users/login',
passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/users/login',
failureFlash: 'Invalid username or password.'
}),
async (req, res) => {
// now, you don't need to query the database for your user
// it should be available on the request already:
var idUser = req.user.id;
}
);
您还应该将检查用户是否被禁止的逻辑移至您的本地策略。
编辑:这是一个更新的本地策略,其中包含用于检查用户是否具有配置且未被禁止的所有逻辑。
编辑 2:
router.post(
'/users/login',
passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/users/login',
}),
async (req, res) => {
if (!req.user.configuration) {
//const id = consultaUsuario._id;
req.logOut(req.user);
const id = req.user._id;
req.user = null;
res.redirect('/users/verify?=' + id);
} else {
res.redirect('/');
}
}
);
passport.use(
new LocalStrategy(
{
usernameField: 'username',
passwordField: 'password',
},
async (username, password, done) => {
const user = await User.findOne({ username: username });
if (!user) {
return done(null, false, {
message: 'Este usuario no existe.',
});
}
const match = await user.matchPassword(password);
if (!match) {
return done(null, false, {
message: 'Usuario/Contraseña no correctos.',
});
}
const configuracion = await Config.findOne({
idUsuario: user._id,
});
if (!configuracion) {
user.configuration = false;
} else {
const delStatus = configuracion.deleteStatus;
const banStatus = configuracion.banStatus;
user.configuration = true;
if (banStatus) {
done(null, false, {
message:
'Su usuario se encuentra bloqueado de nuestra aplicación, contacte con soporte para más información',
});
} else if (delStatus) {
done(null, false, {
message:
'Este usuario está dado de baja de nuestra plataforma, en caso de error contacte con soporte',
});
}
}
done(null, user);
}
)
);