【问题标题】:Authenticating Users with Password in React Native在 React Native 中使用密码对用户进行身份验证
【发布时间】:2019-10-30 10:07:24
【问题描述】:

各位,我有一些关于与我的 PostgreSQL DB、ExpressJS API 和 React Native 前端交互的一般性问题。

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

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

如果用户名存在并且它与存储在数据库中的密码匹配,那么查询将如何返回例如用户 ID?

我需要知道密码是如何在数据库中散列的吗?

用户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}'`

但是如果用户在应用程序中输入他的密码,它不会被散列,所以我需要发送相同的散列方法来比较这些值吗?

提前致谢! 最好的问候褪色。

【问题讨论】:

  • 那么真的没有人可以给我一个提示或至少一些提示吗? :D

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


【解决方案1】:

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

话虽这么说:如果真人要使用它,我建议使用库来处理您的身份验证,而不是自己编写。有很多事情可能会导致您的应用程序不安全。

【讨论】:

    【解决方案2】:

    您可以使用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 中的 Hash 进行比较:

    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()
        }
    }
    

    【讨论】:

    • 感谢您的回复!因此,即使我想获取用户和他的密码,我也需要发送 POST 请求?而且你知道如何查询两者吗?用户名并像我的编辑中的查询一样传递?因为那个查询给了我 psql 错误,我不确定它是否写错了,或者我的后端处理了 2 个参数错误。
    • 实际上,我的查询工作只需要现在处理所有哈希的东西。
    • 你可以使用 GET,但我使用 POST 的原因是你要在 HTTP 请求中发送用户名和密码,这样数据最好用 body 发送而不是 URL,这就是为什么 POST。为了回答第二部分,您可以添加多个条件,例如:SELECT * FROM WHERE [condition1] AND [consition2];
    • 什么是saltRounds
    • 基本上散列轮次,saltrounds 越高,生成散列所需的时间越多,但暴力破解变得困难
    猜你喜欢
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2017-04-02
    相关资源
    最近更新 更多