我正在我的网站上制作一个身份验证部分。我使用bcrypt-nodejs,passport和passport-http进行身份验证,使用Sql Server和Sequelize进行数据库访问。我已经建立了登录路线,如果我输入正确的密码和电子邮件,则登录成功并返回正确的用户对象,但如果输入了错误的用户名/密码或出现错误,则超时。
我的意思是如果我输入了一个错误的密码,我可以在console.log err
中显示正确的错误,但是if (err) {}
内部没有任何内容,同样的事情发生了如果我输入的数据库不在数据库中,则护照将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);
}
}
});
我昨天工作了好几个小时,我很难过。如果您需要更多信息,请与我们联系。任何帮助将不胜感激。在此先感谢您的帮助!
答案 0 :(得分:1)
答案当然很简单......我在路线的开头宣布E
,所以当没有用户对象时,此功能在此时崩溃,但它在控制台之后。记录所以它记录了&*E
。 @Datsick还指出了我正确的方向,当我也意识到修复console.log问题后,无论失败的原因是什么,我都收到了同样的错误。
最后,工作auth看起来像这样:
passport_strat.js:
var userEmail = user.dataValues.password;
我的路线看起来像这样(模型没有变化):
err
感谢您的帮助!
答案 1 :(得分:0)
尝试返回res.json
return res.json
如果出现错误,您的if语句会尝试发送回复,然后它会降至!user
,如果出现错误,我确定也是如此,所以它是'试图发送多个标题,这可能是搞砸了你。