Passport 登录有效,但密码不正确只是超时
Passport login works, but incorrect password just times out
我正在我的网站上制作一个授权部分。我正在使用 bcrypt-nodejs、passport 和 passport-http 进行身份验证,并使用 Sql Server 和 Sequelize 作为我的数据库。我已经创建了一个登录路径,如果我输入了正确的密码和电子邮件,那么登录就会成功并且 returns 是正确的用户对象,但是如果输入了错误的 username/password 或者有错误,那么它会计时出去。
我的意思是,如果我输入了一个错误的密码,我可以 console.log err
并显示正确的错误,但是 if (err) {}
里面什么都没有,并且如果我输入不在数据库中的电子邮件,user
的护照 returns undefined
但 if (!user) {}
中的任何内容都无法访问,也会发生同样的事情。但是,如果我输入正确的用户名和密码,它就会到达 if (user) {}
并调用 res.json({msg: 'authenticated as ', userEmail});
并且 userEmail 的信息是正确的。
这是我的路线:
app.get('/login', function(req, res, next) {
passport.authenticate('basic', function(err, user, info) {
console.log(clc.blueBright('err :::::: '), err);
var userEmail = user.dataValues.password;
if (err) {
res.json({
msg: 'internal server error'
});
}
if (!user) {
console.log(clc.redBright('!user :::::: '));
res.json({
msg: 'invalid username or password'
});
}
if (user) {
res.json({
msg: 'authenticated as ',
userEmail
});
}
})(req, res, next);
});
我的 passport_strat 看起来像这样:
'use strict';
var Basic = require('passport-http').BasicStrategy;
var User = require('../models/User');
var clc = require('cli-color');
module.exports = function(passport) {
passport.use('basic', new Basic({}, function(email, password, done) {
User.findOne({
where: {
email: email
}
})
.then(function(user) {
// console.log(clc.greenBright('Done Callback :::: '), done);
if (!user) {
return done('no such user');
}
if (!user.$modelOptions.instanceMethods.verifyPassword(password, user.dataValues.password)) {
return done('wrong password');
}
if (user.$modelOptions.instanceMethods.verifyPassword(password, user.dataValues.password)) {
// console.log(clc.blueBright('password matched'));
return done(null, user);
}
})
.error(function(err) {
console.log(err);
res.status(500).json({
msg: 'there was a problem logging in to your account'
});
})
}));
}
我的用户模型如下所示:
var User = module.exports = sql.define('User', {
userName: Sql.STRING,
password: Sql.STRING,
email: Sql.STRING,
}, {
instanceMethods: {
verifyPassword: function(password, userPassword) {
return bcrypt.compareSync(password, userPassword);
},
generateToken: function(secret, callback) {
return eat.encode({
id: this.id
}, secret, callback);
},
generateHash: function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
}
}
});
昨天我为此工作了几个小时,我被难住了。如果您需要更多信息,请告诉我。任何帮助将不胜感激。预先感谢您的所有帮助!
尝试返回您的 res.json
return res.json
如果出现错误,您的 if 语句将尝试发送响应,然后它会下降到 !user
如果出现错误,我确定也是如此,因此它正在尝试发送multiple headers 这可能是你搞砸的原因。
嗯,答案当然很简单...我在路由的开头声明了 var userEmail = user.dataValues.password;
,所以当没有用户对象时,函数此时崩溃了,但它是在console.log 所以它记录了 err
。 @Datsick 也给我指出了正确的方向,当我也意识到在修复 console.log 问题后,无论失败的原因是什么,我都会收到同样的错误。
最后,工作授权看起来像这样:
passport_strat.js:
'use strict';
var Basic = require('passport-http').BasicStrategy;
var User = require('../models/User');
var clc = require('cli-color');
module.exports = function(passport) {
passport.use('basic', new Basic({}, function(email, password, done) {
User.findOne({
where: {
email: email
}
})
.then(function(user) {
if (user) {
var verified = user.$modelOptions.instanceMethods.verifyPassword(password, user.dataValues.password);
}
if (!user) {
done('no such user');
}
if (user && !verified) {
done('wrong password');
}
if (user && verified) {
done(null, user);
}
})
.error(function(err) {
console.log(err);
res.status(500).json({
msg: 'there was a problem logging in to your account'
});
done(err);
})
}));
}
我的路线看起来像这样(模型没有改变):
app.get('/login', function(req, res, next) {
passport.authenticate('basic', {
session: false
}, function(err, user, info) {
if (err && user) {
console.log(clc.redBright('Login error: '), err);
res.json({
msg: 'internal server error'
});
}
// if user is not found due to wrong username or password
if (err && !user) {
console.log(clc.redBright('Login error: '), err);
res.json({
msg: 'invalid username or password'
});
}
if (user && !err) {
var userEmail = user.dataValues.email;
res.json({
msg: 'authenticated as ',
userEmail
});
}
})(req, res, next);
});
感谢大家的帮助!
我正在我的网站上制作一个授权部分。我正在使用 bcrypt-nodejs、passport 和 passport-http 进行身份验证,并使用 Sql Server 和 Sequelize 作为我的数据库。我已经创建了一个登录路径,如果我输入了正确的密码和电子邮件,那么登录就会成功并且 returns 是正确的用户对象,但是如果输入了错误的 username/password 或者有错误,那么它会计时出去。
我的意思是,如果我输入了一个错误的密码,我可以 console.log err
并显示正确的错误,但是 if (err) {}
里面什么都没有,并且如果我输入不在数据库中的电子邮件,user
的护照 returns undefined
但 if (!user) {}
中的任何内容都无法访问,也会发生同样的事情。但是,如果我输入正确的用户名和密码,它就会到达 if (user) {}
并调用 res.json({msg: 'authenticated as ', userEmail});
并且 userEmail 的信息是正确的。
这是我的路线:
app.get('/login', function(req, res, next) {
passport.authenticate('basic', function(err, user, info) {
console.log(clc.blueBright('err :::::: '), err);
var userEmail = user.dataValues.password;
if (err) {
res.json({
msg: 'internal server error'
});
}
if (!user) {
console.log(clc.redBright('!user :::::: '));
res.json({
msg: 'invalid username or password'
});
}
if (user) {
res.json({
msg: 'authenticated as ',
userEmail
});
}
})(req, res, next);
});
我的 passport_strat 看起来像这样:
'use strict';
var Basic = require('passport-http').BasicStrategy;
var User = require('../models/User');
var clc = require('cli-color');
module.exports = function(passport) {
passport.use('basic', new Basic({}, function(email, password, done) {
User.findOne({
where: {
email: email
}
})
.then(function(user) {
// console.log(clc.greenBright('Done Callback :::: '), done);
if (!user) {
return done('no such user');
}
if (!user.$modelOptions.instanceMethods.verifyPassword(password, user.dataValues.password)) {
return done('wrong password');
}
if (user.$modelOptions.instanceMethods.verifyPassword(password, user.dataValues.password)) {
// console.log(clc.blueBright('password matched'));
return done(null, user);
}
})
.error(function(err) {
console.log(err);
res.status(500).json({
msg: 'there was a problem logging in to your account'
});
})
}));
}
我的用户模型如下所示:
var User = module.exports = sql.define('User', {
userName: Sql.STRING,
password: Sql.STRING,
email: Sql.STRING,
}, {
instanceMethods: {
verifyPassword: function(password, userPassword) {
return bcrypt.compareSync(password, userPassword);
},
generateToken: function(secret, callback) {
return eat.encode({
id: this.id
}, secret, callback);
},
generateHash: function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
}
}
});
昨天我为此工作了几个小时,我被难住了。如果您需要更多信息,请告诉我。任何帮助将不胜感激。预先感谢您的所有帮助!
尝试返回您的 res.json
return res.json
如果出现错误,您的 if 语句将尝试发送响应,然后它会下降到 !user
如果出现错误,我确定也是如此,因此它正在尝试发送multiple headers 这可能是你搞砸的原因。
嗯,答案当然很简单...我在路由的开头声明了 var userEmail = user.dataValues.password;
,所以当没有用户对象时,函数此时崩溃了,但它是在console.log 所以它记录了 err
。 @Datsick 也给我指出了正确的方向,当我也意识到在修复 console.log 问题后,无论失败的原因是什么,我都会收到同样的错误。
最后,工作授权看起来像这样:
passport_strat.js:
'use strict';
var Basic = require('passport-http').BasicStrategy;
var User = require('../models/User');
var clc = require('cli-color');
module.exports = function(passport) {
passport.use('basic', new Basic({}, function(email, password, done) {
User.findOne({
where: {
email: email
}
})
.then(function(user) {
if (user) {
var verified = user.$modelOptions.instanceMethods.verifyPassword(password, user.dataValues.password);
}
if (!user) {
done('no such user');
}
if (user && !verified) {
done('wrong password');
}
if (user && verified) {
done(null, user);
}
})
.error(function(err) {
console.log(err);
res.status(500).json({
msg: 'there was a problem logging in to your account'
});
done(err);
})
}));
}
我的路线看起来像这样(模型没有改变):
app.get('/login', function(req, res, next) {
passport.authenticate('basic', {
session: false
}, function(err, user, info) {
if (err && user) {
console.log(clc.redBright('Login error: '), err);
res.json({
msg: 'internal server error'
});
}
// if user is not found due to wrong username or password
if (err && !user) {
console.log(clc.redBright('Login error: '), err);
res.json({
msg: 'invalid username or password'
});
}
if (user && !err) {
var userEmail = user.dataValues.email;
res.json({
msg: 'authenticated as ',
userEmail
});
}
})(req, res, next);
});
感谢大家的帮助!