在React Native中使用密码对用户进行身份验证

时间:2019-10-30 10:07:24

标签: node.js reactjs postgresql react-native express

我对与PostgreSQL数据库,ExpressJS API和React Native Frontend交互有一些一般性疑问。

我设法编写了一些查询,例如检查在RN应用程序中输入的用户名是否与数据库上的用户名匹配,并返回其用户ID。

我知道在我的数据库中,每个用户都有其密码以散列方式存储在数据库中。

查询将如何返回(例如)我正在执行的userID,但前提是用户名存在并且与存储在数据库中的密码匹配?

我是否需要知道密码在数据库上的散列方式?

用户ID查询:

    static getUserId (username, callback) {
    db.query(`SELECT userid FROM employee WHERE username = '${username}'`, (err, res)=> {
        if(err.error){
            return callback(err.error)
        } else {
            return callback(res)
        }
    })
}

密码保存在同一员工表中的密码下。

编辑:我想我可以接受两个这样的WHERE语句:

`SELECT userid FROM employee WHERE username = '${username}' AND WHERE password = '${password}'`

但是,如果用户在应用程序内输入密码,则不会对其进行哈希处理,因此我是否需要发送相同的哈希方法来比较这些值?

提前谢谢! 最好的问候已消失。

2 个答案:

答案 0 :(得分:0)

您需要对输入的密码进行哈希处理并比较两个哈希值。

这就是说:如果这将完全由真实的人使用,我建议使用一个库来处理您的身份验证,而不是编写您自己的。很多事情都会出错,使您的应用程序不安全。

答案 1 :(得分:0)

您可以使用bcrypt.js对密码进行哈希处理。

要在 SignUp.js 中对密码进行哈希处理:

app.post('/signup',(req,res,next)=> {
 //Password from request body of register request
    const myPlaintextPassword = req.body.password
    //saltRounds are typically set to 12
    bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
      // Store hash in your password DB with INSERT.
    });
}

现在可以在 Login.js 中与哈希进行比较:

app.post('/login',async (req,res,next)=>{
const existingUser = await db.query(`SELECT userid FROM employee WHERE username = '${username}'`, (err, res)=> {
        if(err.error){
            return callback(err.error)
        } else {
            return callback(res)
        }
    })
    const valid = await bcrypt.compare(req.body.password, existingUser.password);
if (!valid) {
        res.status(401).send('Wrong pass');
        return req.next()
    }
}