im正在尝试创建一个登录端点/api,并且我正在通过身份验证头发送用户登录数据,这对安全性来说可以吗?授权头实际上包含一个对象,它被编码为Base64,它包含用户数据,如散列密码(在本代码中尚未散列(、用户名和某种服务器密钥(用于授权是否是发送api请求的正确客户端(,只是想确保它是否安全
const aFunction = (req, res) => {
require('crypto').randomBytes(48, function(err, buffer) {
const token = buffer.toString('hex');
const auth = JSON.parse(Buffer.from(req.headers.authorization, 'base64').toString('ascii'))
if(auth.serverkey == version["serverkey"]){
loginUser(auth.username,token).then(data =>{
if (data.rows.length < 1 || data.rows[0].password != auth.password) {
res.send({
status: "failed",
message: "Username/Password is wrong",
status_code: 400
})
}else{
res.send({
status: "success",
message: "successfully logged in",
status_code: 200, token: token
})
}
})
}else{
res.send({
status: "failed",
message: "Unauthorized Client",
status_code: 401
})
}
});
}
我会在代码中添加对if (req.secure)
的检查,并拒绝任何非https请求。(如果你的nodejs程序在反向代理后面,就不要这样做。(
使用浏览器的用户可以看到您通过https或http来回发送到服务器的所有。(devtools(所以,如果通过阅读你的标题,他们可以找到如何向你发送恶意标题,那么有人会的。并且base64编码与完全不编码具有完全相同的安全性。所以,对你的密码撒盐并散列。使用bcrypt包或jwts。
我将以这种方式处理错误,通过使用错误参数调用next()
,而不是使用.send()
传递失败消息。使用这种代码。
const createError = require('http-errors')
...
const myfunction (req, res, next) {
...
if (!req.secure) return next(createError(403, 'https required'))
...
});