Passport使用bcrypt使用加密的用户名对中间件进行身份验证

问题描述 投票:0回答:1

当使用NPM bcryptjs库对用户名进行加密时,我需要一些有关如何使用passport.authenticate()的帮助。

例如,当我创建一个用户时,我先使用username.js加密用户名,然后将该用户创建并保存到MongoDB。然后,在我登录的路径中,我传入password.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 });
    });
});
node.js passport.js passport-local
1个回答
0
投票

更新:我能够更深入地了解“ passport.js”的文档,发现“ passport.authenticate()”是由“ passport.use”实例处理的(新LocalStrategy(...))。通过这种方法,我能够添加自己的自定义逻辑来处理对加密用户名的检查。

在我刚使用之前

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);
              });
            }
          ));
    ```
© www.soinside.com 2019 - 2024. All rights reserved.