Я использую Node.js
в качестве бэкэнд-сервера API для клиента iPhone. Я использую Passport.js
для аутентификации с local strategy
. Соответствующий код ниже:
// This is in user.js, my user model
UserSchema.static('authenticate', function(username, password, callback) {
this.findOne({ username: username }, function(err, user) {
if (err){
console.log('findOne error occurred');
return callback(err);
}
if (!user){
return callback(null, false);
}
user.verifyPassword(password, function(err, passwordCorrect){
if (err){
console.log('verifyPassword error occurred');
return callback(err);
}
if (!passwordCorrect){
console.log('Wrong password');
return callback(err, false);
}
console.log('User Found, returning user');
return callback(null, user);
});
});
});
а также
// This is in app.js
app.get('/loginfail', function(req, res){
res.json(403, {message: 'Invalid username/password'});
});
app.post('/login',
passport.authenticate('local', { failureRedirect: '/loginfail', failureFlash: false }),
function(req, res) {
res.redirect('/');
});
Прямо сейчас мне удалось перенаправить неудачный вход в систему в /loginfail, где я отправил обратно часть JSON клиенту iPhone. Тем не менее, это не имеет достаточной детализации. Я хочу иметь возможность отправлять соответствующие ошибки клиенту iPhone, например: "Пользователь не найден" или "Пароль неверный". С моим существующим кодом я не вижу, как это можно сделать.
Я пытался следовать примерам для пользовательского обратного вызова на сайте passport.js, но я просто не могу заставить его работать из-за отсутствия понимания узла. Как я могу изменить свой код, чтобы иметь возможность отправить файл res.json с соответствующим кодом ошибки/сообщением?
РЕДАКТИРОВАТЬ: я пытаюсь что-то вроде этого сейчас:
// In app.js
app.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err) }
if (!user) {
console.log(info);
// *** Display message without using flash option
// re-render the login form with a message
return res.redirect('/login');
}
console.log('got user');
return res.json(200, {user_id: user._id});
})(req, res, next);
});
// In user.js
UserSchema.static('authenticate', function(username, password, callback) {
this.findOne({ username: username }, function(err, user) {
if (err){
console.log('findOne error occurred');
return callback(err);
}
if (!user){
return callback(null, false);
}
user.verifyPassword(password, function(err, passwordCorrect){
if (err){
return callback(err);
}
if (!passwordCorrect){
return callback(err, false, {message: 'bad password'});
}
console.log('User Found, returning user');
return callback(null, user);
});
});
});
Но вернемся, когда я пытаюсь открыть console.log(info), он просто говорит неопределенный. Я не знаю, как заставить этот пользовательский обратный вызов работать... Любая помощь будет оценена!