我正在我的网站上创建一个身份验证部分。我使用bcrypt-nodejs、passport 和passport-http 进行身份验证,并使用Sql Server 和Sequelize 作为我的数据库。我已经制定了登录路线,如果输入正确的密码和电子邮件,则登录成功并返回正确的用户对象,但如果输入错误的用户名/密码或出现错误,则会超时。
我的意思是,如果我输入错误的密码,我可以console.log err
它显示了正确的错误,但 if (err) {}
内没有任何内容已达到,如果我输入不在数据库中的电子邮件,也会发生同样的事情, Passport 返回 undefined
对于 user
但 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);
}
}
});
昨天我为此工作了几个小时,但我被难住了。如果您需要更多信息,请告诉我。任何帮助将不胜感激。预先感谢您的所有帮助!
最佳答案
答案当然很简单...我在路线开始时声明了 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);
});
感谢您的帮助!
关于javascript - Passport 登录可以,但密码错误只是超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35708281/