CompareSync всегда ложно - PullRequest
       9

CompareSync всегда ложно

0 голосов
/ 25 октября 2019

Я пытаюсь создать функцию входа / регистрации в моем веб-приложении, которая позволяет пользователю входить в систему и регистрироваться в базе данных.

В API регистрации нет ничего плохого, насколько я знаю, потому что этоможете добавить пользователя в мою базу данных.

// зарегистрировать API

let sql = `INSERT INTO AUTHENTICATION (name, email, password) \
 VALUES (?, ?, ?)`;
myDB.query(sql, [req.body.name, req.body.email, bcrypt.hashSync(req.body.password, 8)],
    (error, results) => {
        if (error) {
            return res.status(500).send("There was a problem registering the user.")
        } else {
            let sql = "SELECT * FROM AUTHENTICATION WHERE email = ?"
            myDB.query(sql, [req.body.email], (error, rows) => {
                if (error) {
                    return res.status(500).send("There was a problem getting user")
                } else {
                    //change rows.email to rows.id to be more secure
                    let token = jwt.sign({ email: rows.id }, config.secret, {
                        expiresIn: 86400
                    });
                    res.status(200).send({ auth: true, token: token, user: rows });
                }
            })
        }
    })

Здесь у меня проблема, потому что compareSync всегда возвращает false.

// loginAPI

let sql = "SELECT * FROM AUTHENTICATION WHERE email = ?";
myDB.query(sql, [req.body.email, req.body.password], (error, results) => {
    if (error) {
        console.log(error);
        res.status(500).send('Error on the server')
    } else {
        if (!results) {
            return res.status(404).send('No user found.');
        } else {
            //compare password from client side and hash password in database.
            let checkPassword = bcrypt.compareSync(req.body.password, results[0].password);
            console.log(checkPassword);
            if (!checkPassword) {
                //if password doesn't match
                return res.status(401).send({
                    auth: false, token: null
                });
            } else {
                //password matched
                let token = jwt.sign({ id: results.id }, config.secret, {
                    expiresIn: 86400 // expires in 24 hours
                });
                res.status(200).send({ auth: true, token: token, user: results });
            }
        }
    }
})

Я думаю, в этой части он всегда возвращает false

let checkPassword = bcrypt.compareSync(req.body.password, results[0].password);
            console.log(checkPassword);

1 Ответ

0 голосов
/ 25 октября 2019

Я думаю, bcrypt.compare может занять некоторое время для сравнения, поэтому вы можете попробовать этот способ

let sql = "SELECT * FROM AUTHENTICATION WHERE email = ?";
myDB.query(sql, [req.body.email, req.body.password],async (error, results) => {
    if (error) {
        console.log(error);
        res.status(500).send('Error on the server')
    } else {
        if (!results) {
            return res.status(404).send('No user found.');
        } else {
            //compare password from client side and hash password in database.
            let checkPassword =await bcrypt.compareSync(req.body.password, results[0].password);
            console.log(checkPassword);
            if (checkPassword) {
                   //password matched
                    let token = jwt.sign({ id: results.id }, config.secret, {
                        expiresIn: 86400 // expires in 24 hours
                    });
                    res.status(200).send({ auth: true, token: token, user: results });
                } else {
                       //if the password doesn't match

                      return res.status(401).send({
                        auth: false, token: null
                    });
                }
            }
        }
    })
...