Паспорт. js: done (null, false) не передает значение false внутри запроса и не вызывает следующий код в маршруте - PullRequest
0 голосов
/ 10 февраля 2020

мой код для аутентификации пользователя по электронной почте и паролю работает нормально. Однако, когда адрес электронной почты или пароль пользователя не существует в базе данных, эта строка:

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 Идея, что я сделал не так?

...