Passport аутентифицирует промежуточное ПО с зашифрованным именем пользователя, используя bcrypt - PullRequest
0 голосов
/ 18 февраля 2020

Мне нужна помощь в использовании passport.authenticate (), когда имя пользователя зашифровано с использованием библиотеки NPM bcrypt js.

Например, когда я создаю пользователя, я шифрую имя пользователя перед использованием паспорта. js для создания и сохранения пользователя в MongoDB. Затем в моем маршруте для входа я передаю passport.authenticate («local») в качестве промежуточного программного обеспечения, которое выполняет все проверки по имени пользователя и паролю.

В этом сценарии имя пользователя на самом деле является зашифрованной строкой, есть ли способ использовать passport.authenticate для проверки переданного имени пользователя и зашифрованной строки?

Части моего кода, которые составьте маршрут регистрации и входа в систему.

userParam.username = bcrypt.hashSync(userParam.username);

        userModel.create(new userModel(userParam), userParam.password , (error) => {
            if (error) {
                response.Error = error;
                return Promise.resolve(response);
            } 
        });

        //Save user
        passport.authenticate('local')(req, res, function () {
            req.session.save((error) => {
                if (error) {
                    response.Error = error;
                    return Promise.resolve(error);
                }
            });
        });

маршрут входа в систему.

app.get('/api/user/login', passport.authenticate('local'), function (req, res) {
    req.session.save((err) => {
        if (err) {
            return res.json({ message: "Failed to sign in", err });
        }

        res.json({ status: "Signed In", authenticated: req.isAuthenticated(), user: req.user, session: req.session });
    });
});

1 Ответ

0 голосов
/ 19 февраля 2020

Обновление: мне удалось глубже изучить документацию для паспорта. js и я обнаружил, что passport.authenticate () был обработан экземпляром passport.use (new LocalStrategy (...)). В этом методе я смог добавить свой собственный логик c для проверки по зашифрованному имени пользователя.

До того, как я просто использовал

passport.use(new LocalStrategy(User.authenticate()));

И я смог обновить для моего варианта использования выполняю следующее ....

passport.use(new LocalStrategy(
            async function(username, password, done) {
              let allUsers = await User.find({});

              if(username.length == 7) {

                  for(var i = 0; i < allUsers.length; i++) {
                    if (bcrypt.compareSync(username, allUsers[i].username)) {
                        username = allUsers[i].username ;
                        break;
                    }
                  }
              }

              User.findOne({ username }, function (err, user) {
                if (err) {
                     return done(err); 
                }
                if (!user) {
                  return done(null, false, { message: 'Incorrect username.' });
                }
                if (!password) {
                  return done(null, false, { message: 'Incorrect password.' });
                }
                return done(null, user);
              });
            }
          ));
    ```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...