我对与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}'`
但是,如果用户在应用程序内输入密码,则不会对其进行哈希处理,因此我是否需要发送相同的哈希方法来比较这些值?
提前谢谢! 最好的问候已消失。
答案 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()
}
}