Nodejs Mongoose Bcrypt 当我更改哈希密码时我无法重新登录
Nodejs Mongoose Bcrypt when i change hash password i cant login back
当我更新密码时,我无法重新登录。给出响应密码不匹配错误,但如果我不更新密码,我可以登录。
第 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
的return值覆盖了密码(comparepass
似乎return一个boolean
)。
这可能是一个潜在的错误(如果我没看错的话),因为 req.body.password
似乎被 true
/false
覆盖了,这意味着您保存了true
/false
(而不是用户新密码的哈希值)当您调用 data.save()
.
(如果comparepassword
return是boolean
,你可以直接在if
语句中使用它的return值。不需要比较它data.password
或 req.body.password
.)
在路线 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 条件下分配一个变量?
当我更新密码时,我无法重新登录。给出响应密码不匹配错误,但如果我不更新密码,我可以登录。
第 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
的return值覆盖了密码(comparepass
似乎return一个boolean
)。
这可能是一个潜在的错误(如果我没看错的话),因为 req.body.password
似乎被 true
/false
覆盖了,这意味着您保存了true
/false
(而不是用户新密码的哈希值)当您调用 data.save()
.
(如果comparepassword
return是boolean
,你可以直接在if
语句中使用它的return值。不需要比较它data.password
或 req.body.password
.)
在路线 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 条件下分配一个变量?