我正在Node.js用作iPhone客户端的后端API服务器。我正在使用Passport.js进行身份验证local strategy。相关代码如下:
Node.js
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)时,它只是说未定义。我不知道如何使此自定义回调工作…任何帮助将不胜感激!
我相信您的“身份验证”静态调用(在代码中称为“回调”)的回调函数接受代码可以提供的第三个参数-“ info”。然后,而不是传入{failureRedirect:…}对象,而是传入一个带有3个参数的函数- err,user和info。您在authenticate方法中提供的“信息”将传递给此回调。
Passport将此情况称为“自定义回调”。请参阅此处的文档:http : //passportjs.org/guide/authenticate/