мой код для аутентификации пользователя по электронной почте и паролю работает нормально. Однако, когда адрес электронной почты или пароль пользователя не существует в базе данных, эта строка:
return done(null,false)
не запускает выполнение кода внутри маршрутизатора, который существует после:
passport.authenticate("local-login")
Вот определение стратегии паспорта:
passport.use(
"local-login",
new LocalStrategy(
{
//TODO: Understand how username is overrided with email?
// by default, local strategy uses username and password, we will override with email
usernameField: "username",
passwordField: "password",
passReqToCallback: true // allows us to pass back the entire request to the callback
},
//
function(req, email, password, done) {
// callback with email and password from our form
logger.warning("REQUEST INSIDE PASSPORT ", req.body.username);
logger.warning("EMAIL INSIDE PASSPORT ", email);
process.nextTick(function() {
logger.info("verifying user");
adminService.authenticateAdmin(email, password, function(
callbackResult,
admin
) {
logger.warning(
"authenticateAdmin callbackResult: " +
JSON.stringify(callbackResult)
);
logger.info(
"authenticateAdmin success: " +
callbackResult.success +
" error: " +
callbackResult.error
);
if (callbackResult.success == error_codes.success) {
console.log(' INSIDE: callbackResult.success == error_codes.success')
logger.alert("authenticateAdmin : " + JSON.stringify(admin));
return done(null, admin);
} else if (callbackResult.success == error_codes.success_none) {
console.log(' INSIDE: callbackResult.success == error_codes.success_none')
//return done(null, false);
return done(null, false);
} else {
console.log(' INSIDE: last else')
return done(null, false);
}
});
});
}
)
);
};
Вот маршрут аутентификации:
router.post(
"/login",
function(req, res, next) {
logger.notice("POST /admin_authenticate body: " + req.body);
console.log(req.body);
next();
},
passport.authenticate("local-login"),
function(request, response) {
logger.info("INSIDE FUNCTION AFTER AUTHENTICATE");
if (!request.user) {
logger.info("!request.user");
console.log(request.user.dataValues);
return response.json({ success: false});
} else {
logger.info("request.user");
console.log(request.user.dataValues);
var user = request.user;
//TODO: How come we write request.user and not request.admin
// Apparently passport stores the returned value in done in request.user
logger.info("------->D" + JSON.stringify(user));
let jwToken = jwt.sign(user.toJSON(), cryptoConfig.appTokenKey, {
expiresIn: 3600 // expires in 1 Hour
});
let tokenToAdd = {
token: jwToken,
adminId: user.id
};
logger.info("Adding token to admin:" + tokenToAdd);
tokenServices.addtoken(tokenToAdd, function(tokenCreated) {
logger.notice("tokenCreated:" + JSON.stringify(tokenCreated));
let theAdmin = {
token: tokenCreated.token,
id: user.id,
email: user.email,
name: user.name,
role: user.role
};
logger.notice("theAdmin:" + JSON.stringify(theAdmin));
return response.json({ success: true, admin: theAdmin });
});
}
}
);
Вот журнал после отправки электронного письма, которого нет в базе данных:
2020-02-10T15:03:46+0100 <notice> admin_routes.js:380 POST /admin_authenticate body: [object Object]
{ username: 'super_user@gmail.coma', password: '951357159357' }
2020-02-10T15:03:46+0100 <warning> passport.js:60 Strategy._verify REQUEST INSIDE PASSPORT + super_user@gmail.coma
2020-02-10T15:03:47+0100 <warning> passport.js:61 Strategy._verify EMAIL INSIDE PASSPORT + super_user@gmail.coma
2020-02-10T15:03:47+0100 <info> passport.js:63 verifying user
Executing (default): SELECT "id", "nom", "email", "mot_de_passe", "last_login", "role", "createdAt", "updatedAt" FROM "admins" AS "admin" WHERE "admin"."email" = 'super_user@gmail.coma';
2020-02-10T15:03:47+0100 <warning> passport.js:68 authenticateAdmin callbackResult: {"success":0,"error":-1}
2020-02-10T15:03:47+0100 <info> passport.js:72 authenticateAdmin success: 0 error: -1
2020-02-10T15:03:47+0100 <info> passport.js:83 INSIDE: callbackResult.success == error_codes.success_none
Эта строка сразу после вызова аутентифицирует в маршруте:
logger.info("INSIDE FUNCTION AFTER AUTHENTICATE");
ничего не регистрирует, несмотря на то, что это условие выполняется:
if (callbackResult.success == error_codes.success_none) {
logger.info(" INSIDE: callbackResult.success == error_codes.success_none"); //This gets logged
return done(null, false); //This doesn't do its work
}
следовательно выполнено (null, false) выполнено. Но следующий код в маршруте не является!
И, следовательно, этот код:
if (!request.user) {
logger.info("!request.user");
console.log(request.user.dataValues);
return response.json({ success: false });
}
, очевидно, не выполняется ..
Напоминание: Если аутентификация успешна, последующий код в маршруте выполняется , поэтому done (null, admin) выполнил свою работу.
Таким образом, этот код вызывает следующий код после аутентификации в роутере :
if (callbackResult.success == error_codes.success) {
logger.info(" INSIDE: callbackResult.success == error_codes.success");
logger.alert("authenticateAdmin : " + JSON.stringify(admin));
return done(null, admin);
}
PS: logger - это просто модуль регистрации, который я использую для лучшей регистрации вместо console.log
Any Идея, что я сделал не так?