我試圖在我的node.js應用程序中使用passport.js來使用MongoDB對用戶進行身份驗證。我從來沒有成功。護照本地返回400錯誤,從不查詢數據庫
在帖子中,我發送 「郵件」: 「[email protected]」, 「密碼」: 「測試」
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');
}
});
});
}));
在MongoDB中 '用戶' 集合:
{
"_id": {
"$oid": "533b5283e4b09d8a1148b4c4"
},
"email": "[email protected]",
"password": "test"
}
也許我沒有連接到數據庫的權利,我不確定。
此外,當我記錄整個函數時,我沒有得到任何日誌。我只是得到
POST /login 302 7ms - 39b
GET /fail 404 3ms
任何意見將不勝感激。我想我可能會錯過一些東西,但我不確定如何構造這個。在我寫數據庫的其他功能,我必須使用:
var uristring =
process.env.MONGOLAB_URI ||
process.env.MONGOHQ_URL ||
'mongodb://<myurlhere>';
mongo.connect(uristring, function (err, db) {
這裏是更新的代碼
要求這些:使用這些
, passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
:
// 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);
});
此代碼在發佈到/ login時總是給我POST /login 400 10ms
。我所有的其他路線工作正常。
你的代碼是在一個文件中還是分解成模塊?我問,因爲你稱呼事情的順序可能很重要。另外,您是否因特定原因將'process.nextTick'留在代碼中?我相信它是在示例代碼中「模擬」數據庫調用的延遲,但實際上並不需要。 –
不,我剛開始這個應用程序,目前這個功能是在app.js.我打算在認證工作後打破這個模塊。 – Joel
我已經嘗試了很多東西。 (''login',passport.authenticate('local'),function(req,res){' 'console.log('SUCCESS WOOOO');'' # '// req.user contains the authenticated user.' '//res.redirect('/users/'+ req.user.username);'# '//如果此函數被調用,認證成功。 '});' – Joel