在 NodeJS 和Express上使用Passport时缺少凭据

moiiocjp  于 2023-01-01  发布在  Node.js
关注(0)|答案(1)|浏览(119)

我正在做一个开发API的项目。问题是我正在使用Passport,有一个错误“缺少凭据”。我到处都找遍了,不知道该怎么办。

索引.js的一部分

app.use(express.static(publicc));
app.use(express.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(passport.initialize());
app.use(session({
    secret: 'secret',
    resave: false,
    saveUninitialized: false
}));
app.use(passport.session());
app.use(cors());
app.use(morgan('dev'));

带注册功能的Passport.js

passport.use('signup', new localStrategy({
        usernameField: 'email',
        passwordField: 'password',
        passReqToCallback: true
        }, async (email, password, done) => {
            try {
                console.log('si')
                const user = await findUser(email);
                if (user.length > 0) {
                    return done(null, false, { message: 'User already exists' });
            }
            const salt = await bcrypt.genSalt(10);
            const hashedPassword = await bcrypt.hash(password, salt);

            const newUser = {
                user_name: req.body.user_name,
                user_role: req.body.user_role,
                email: email,
                user_password: hashedPassword
            };

            console.log(newUser);
            const result = await createUser(newUser);
            return done(null, newUser);
            }
            catch (error) {
                console.log('si')
                done(error);
            }
        }
    ));

带SingUp的控制器

const postSignup = async (req, res, next) => {
    passport.authenticate('signup', { session: false }, async(err, user, info) => {
        try{
            console.log(req.body);
            if(err){
                const error = new Error('An error occurred');
                return next(error);
                }
            const message = info.message;

            if(!user){
                res.status(401).json({ success: false, message });
                return
            }

            return res.json({succes: true, message});
        }catch(error){
            return next(error);
        }
    })(req, res, next);
};

我已经试过添加正文解析,但没有任何变化。我已经搜索了每个论坛,但仍然没有答案。

qhhrdooz

qhhrdooz1#

我看到您正在DB中保存电子邮件和密码,但您没有保存盐来比较登录时从用户收到的密码与您保存在DB中的密码。https://en.wikipedia.org/wiki/Salt_(cryptography)您进入身份验证。
1.通过电子邮件从数据库获取用户。
1.检查您从用户收到的散列密码+保存在数据库中的此用户的salt是否等于您数据库中的散列密码。或者只是删除salt,不散列密码(但强烈不建议),在它将工作后,尝试使任务复杂化,散列没有salt的密码。在它将工作后,尝试添加salt。
看看这个例子如何使用护照与本地策略+快递. https://github.com/jaredhanson/passport-local/wiki/Examples

相关问题