node.js - Nodejs Mongoose Bcrypt 当我更改哈希密码时我无法重新登录
问题描述
当我更新密码时,我无法重新登录。给出响应密码不匹配错误,但如果我不更新密码,我可以登录。
第 1 步(注册)
Customer.findOne({$or:[{email:user.email},{username:user.username}]},function(err,data){
if(!data){
var tokencreator = generateUUID();
var customer = new Customer({
userid:uuidv4(),
username:req.body.username,
email:req.body.email,
password:hashpass(req.body.password),
token:tokencreator,
registerdate:new Date(),
lastlogin:new Date()
})
customer.save()
数据库你可以看到工作寄存器。
第 2 步(更新密码)
app.post('/passnewer', function(req,res){
console.log(req.body)
Customer.findOne({passtoken:req.body.token},function(err,data){
if(data){
if(req.body.password != data.username){
if(req.body.password = comparepass(req.body.password,data.password)){
res.send({"Success":"Your New Password Cannot Be The Same As Your Old Password!","redirect":"false"});
}
else{
Customer.findOne({passtoken:req.body.token},function(err,data){
data.password = hashpass(req.body.password);
data.save();
});
res.send({"Success":"Password Renewal Successful You Are Redirected!","redirect":"true"});
}
}
else{
res.send({"Success":"Your password cannot be the as your username!","redirect":"false"});
}
}
else{
res.send({"Denied":"İnvalid token!"});
}
})
})
响应您可以看到数据库密码已更改。
数据库
第 3 步(登录帐户)当我尝试登录时,它给出了错误。
app.post('/userlogin', function(req,res){
Customer.findOne({email:req.body.email},function(err,data){
if(data){
if(data.password = comparepass(req.body.password,data.password)){
if(data.status != "Active"){
res.send({"Success":"Email verification need!"})
}
else{
req.session.isLoggedIn = true;
req.session.userID = data.userid;
Customer.findOne({userid:req.session.userID},function(err,data){
data.lastlogin = new Date();
data.save()
});
res.send({"Success":"Login Success","redirect":"true"});
}
}else{
res.send({"Success":"Password error!"});
}
}else{
res.send({"Success":"E-Mail error!"});
}
});
})
回复
架构我的架构
var mongoose = require("mongoose")
var Schema = mongoose.Schema;
var customerSchema = new Schema({
userid:String,
username:String,
email:String,
password:String,
address:String,
registerdate:String,
tickets:Array,
token:String,
passtoken:String,
status: {
type: String,
enum: ['Pending', 'Active'],
default: 'Pending'
},
lastlogin:{
type: String,
default: 'TBD'
},
})
var Customer = mongoose.model('Customer',customerSchema)
module.exports = Customer
散列和比较函数Bcrypt 函数
function hashpass(passnohash){
return bcrypt.hashSync(`${hashprefix}${passnohash}`, saltRounds)
}
function comparepass(passnohash, passhash){
return bcrypt.compareSync(`${hashprefix}${passnohash}`, passhash)
}
解决方案
我会将console.log
新密码哈希保存到数据库中,然后console.log
在您尝试重新登录时保存哈希(在步骤 3 中)。看看它们是否相同。
然后特别看一下这些行:
在 POST
/userlogin
请求处理程序中:if(data.password = comparepass(req.body.password,data.password)){
在 POST
/passnewer
请求处理程序中:if(req.body.password = comparepass(req.body.password,data.password)){
上述两行都进行了分配(而不是比较)。因此,您似乎用comparepass
(comparepass
似乎返回 a boolean
) 的返回值覆盖了密码。
这可能是一个潜在的错误(如果我没看错的话),因为req.body.password
似乎被true
/覆盖了false
,这意味着当你调用.true
false
data.save()
(如果comparepassword
返回 a boolean
,您可以直接在if
语句中使用它的返回值。无需将其与data.password
or进行比较req.body.password
。)
推荐阅读
- javascript - 未调用 Select2 选项模板结果
- python - 使用 nltk 和 python 将很长的文本拆分为段落
- javascript - 当输入有自动值时,我可以触发 onChange 函数吗?
- android - 显示内容比率的条形图
- python - 无法将模型文件转换为 .tflite
- php - Cakephp 中的 AWS Cognito 集成
- java - Apache poi - 读取 excel 文件时,如何知道哪个单元格出错
- apache-spark - HDP Sandbox IOException 在 DataFrame 上调用 saveAsTable
- php - 全局更改 Wordpress 查询
- git - Can we ignore some files or folder in a pull git?