问题描述
当我更新密码时,我无法重新登录。给出响应密码不匹配错误,但如果我不更新密码,我可以登录。
第一步(注册)
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},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},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!"});
}
})
})
响应您可以看到数据库密码已更改。
app.post('/userlogin',res){
Customer.findOne({email:req.body.email},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},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
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
似乎返回了 boolean
)。
这可能是一个潜在的错误(如果我没看错的话),因为 req.body.password
似乎被 true
/false
覆盖,这意味着您保存了 {{ 1}}/true
(而不是用户新密码的哈希值),当您调用 false
时。
(如果data.save()
返回一个comparepassword
,您可以直接在boolean
语句中使用它的返回值。无需将其与if
或{{1}进行比较}.)
在路线POST /passnewer' you overwrite
req.body.passwordby
if(req.body.password = comparepass(req.body.password,data.password))`
现在您的新密码将变为 true
(或 false
),然后您将此密码散列并保存到您在数据库中的记录中。
if(comparepass(req.body.password,data.password))
够了,为什么你总是在 if 条件中分配一个变量?