Joe*_*oel 5 node.js passport-local passport.js
我正在尝试在我的node.js应用程序中使用passport.js来验证使用MongoDB的用户.我从来没有成功过.
在帖子中,我发送"email":"email@gmail.com","密码":"测试"
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
app.post('/login',
passport.authenticate('local', { successRedirect: '/',
failureRedirect: '/fail' })
);
passport.use(new LocalStrategy({
emailField: 'email',
passwordField: 'passw',
},
function (emailField, passwordField, done) {
process.nextTick(function () {
db.collection(users, function (error, collection) {
if (!error) {
collection.findOne({
'email': emailField,
'password': passwordField
}, function (err, user) {
if (err) {
return done(err);
}
if (!user) {
console.log('this email does not exist');
return done(null, false);
}
return done(null, user);
});
} else {
console.log(5, 'DB error');
}
});
});
}));
Run Code Online (Sandbox Code Playgroud)
在MongoDB'用户'集合中:
{
"_id": {
"$oid": "533b5283e4b09d8a1148b4c4"
},
"email": "email@gmail.com",
"password": "test"
}
Run Code Online (Sandbox Code Playgroud)
也许我没有正确连接数据库,我不确定.
此外,当我在整个函数中记录所有内容时,我没有得到任何日志.我得到了
POST /login 302 7ms - 39b
GET /fail 404 3ms
Run Code Online (Sandbox Code Playgroud)
任何建议将不胜感激.我想我可能会遗漏一些东西,但我不确定如何构建这个.在我写入数据库的另一个函数中,我必须使用:
var uristring =
process.env.MONGOLAB_URI ||
process.env.MONGOHQ_URL ||
'mongodb://<myurlhere>';
mongo.connect(uristring, function (err, db) {
Run Code Online (Sandbox Code Playgroud)
这是更新的代码
需要这些:
, passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
Run Code Online (Sandbox Code Playgroud)
使用这些:
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({ secret: 'keyboard cat'}));
app.use(logfmt.requestLogger());
app.use(express.static(path.join(__dirname, 'public')));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
// User authentication passport
passport.use(new LocalStrategy(
{
usernameField: 'email',
passwordField: 'passw',
},
function (userId, password, done) {
// removed process.nextTick
console.log('Hey! no more 400 error!');
db.collection(users, function (error, collection) {
if (!error) {
collection.findOne({
'email': userId,
'password': password
}, function (err, user) {
if (err) {
return done(err);
}
if (!user) {
console.log('this email does not exist');
return done(null, false);
}
return done(null, user);
});
} else {
console.log(5, 'DB error');
}
});
}
));
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
done(null, user);
});
app.post('/login', passport.authenticate('local'), function(req, res) {
console.log('SUCCESS WOOOO');
// If this function gets called, authentication was successful.
// `req.user` contains the authenticated user.
//res.redirect('/users/' + req.user.username);
});
Run Code Online (Sandbox Code Playgroud)
POST /login 400 10ms发布到/ login时,此代码总是给我.我所有的其他路线都很好.
Mat*_*tis 17
1)可怕的HTTP 400错误
如果未设置用户名和/或密码,Passport会抛出HTTP 400错误.
请参阅第75行附近的源,其中Strategy.prototype.authenticate会抛出"缺少凭据"错误.
2)诊断原因
在你的代码中,你有块:
passport.use(new LocalStrategy({
emailField: 'email',
passwordField: 'passw',
},
Run Code Online (Sandbox Code Playgroud)
但是emailField护照不承认.回到源代码中,我们看到护照正在寻找:
this._usernameField = options.usernameField || 'username';
this._passwordField = options.passwordField || 'password';
Run Code Online (Sandbox Code Playgroud)
这就是在这种特定情况下抛出HTTP 400的原因.
4)解决问题
我已经将您的原始代码编辑为我认为比原版更好的工作(更好).编辑时我取消了一些自由并重process.nextTick命名了一些东西.我希望你是一个宽容的人.:)
passport.use(new LocalStrategy(
{
usernameField: 'email',
passwordField: 'passw',
},
function (userId, password, done) {
// removed process.nextTick
console.log('Hey! no more 400 error!');
db.collection(users, function (error, collection) {
if (!error) {
collection.findOne({
'email': userId,
'password': password
}, function (err, user) {
if (err) {
return done(err);
}
if (!user) {
console.log('this email does not exist');
return done(null, false);
}
return done(null, user);
});
} else {
console.log(5, 'DB error');
}
});
}
));
Run Code Online (Sandbox Code Playgroud)
5)一些结束说明:
| 归档时间: |
|
| 查看次数: |
4093 次 |
| 最近记录: |