Tôi đang cố gắng sử dụng passport.js trong ứng dụng node.js của mình để xác thực người dùng bằng MongoDB. Tôi chưa bao giờ thành công.Trả lại hộ chiếu-địa phương 400 lỗi, không bao giờ truy vấn cơ sở dữ liệu
Trong bài viết, tôi gửi "email": "[email protected]", "password": "test"
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');
}
});
});
}));
Trong bộ sưu tập MongoDB 'của người sử dụng:
{
"_id": {
"$oid": "533b5283e4b09d8a1148b4c4"
},
"email": "[email protected]",
"password": "test"
}
Có lẽ tôi không kết nối với cơ sở dữ liệu đúng, tôi không chắc chắn.
Ngoài ra, khi tôi đăng nhập tất cả trong suốt hàm, tôi không nhận được bất kỳ nhật ký nào. Tôi chỉ cần nhận được
POST /login 302 7ms - 39b
GET /fail 404 3ms
Mọi đề xuất sẽ được đánh giá cao. Tôi nghĩ rằng tôi có thể thiếu một cái gì đó nhưng tôi không chắc chắn chính xác làm thế nào để cấu trúc này. Trong chức năng khác mà tôi đang viết để các cơ sở dữ liệu tôi phải sử dụng:
var uristring =
process.env.MONGOLAB_URI ||
process.env.MONGOHQ_URL ||
'mongodb://<myurlhere>';
mongo.connect(uristring, function (err, db) {
Đây là mã được cập nhật
yêu cầu sau đây:
, passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
sử dụng các :
// 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);
});
Mã này luôn mang lại cho tôi POST /login 400 10ms
khi đăng lên/đăng nhập. Tất cả các tuyến đường khác của tôi hoạt động tốt.
Mã của bạn có trong một tệp hoặc được chia thành các mô-đun không? Tôi hỏi vì thứ tự mà bạn gọi là thứ có thể quan trọng. Ngoài ra, bạn có để lại 'process.nextTick' trong mã của bạn vì một lý do cụ thể không? Tôi tin rằng đó là trong mã ví dụ để 'giả' sự chậm trễ của một cuộc gọi DB nhưng không thực sự cần thiết. –
Không, tôi vừa mới bắt đầu ứng dụng này và hiện tại chức năng này nằm trong app.js. Tôi có kế hoạch phá vỡ làm cho mô-đun này nhiều hơn sau khi tôi nhận được xác thực làm việc. – Joel
Tôi đã thử rất nhiều thứ. Hiện tại tôi đang nhận được 404. 'app.post ('/ login', passport.authenticate ('local'), chức năng (req, res) {' 'console.log ('THÀNH CÔNG WOOOO');' '// Nếu chức năng này được gọi, xác thực thành công.' ' // req.user chứa người dùng đã xác thực.' '//res.redirect('/users/ '+ req.user.username);' '});' – Joel