对不起,我对node.js非常陌生,所以我还没有能够绕过这个包裹。我使用Node.js作为iPhone客户端的后端API服务器。我使用Passport.js进行本地策略认证。相关代码如下:发送失败时发送JSON响应Passport.js身份验证
// 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(信息),它只是说不确定。我不知道如何得到这个自定义回调工作...任何帮助将不胜感激!
感谢你为这个。我知道自定义回调,但我的问题是我不明白如何实现它(对于节点和js非常抱歉)。我用我的最新努力编辑了我的问题。正如你所看到的,我试图使用这个“info”参数,但我不知道如何正确使用它 - 当我从身份验证返回时它总是未定义的。 – kurisukun 2013-03-14 02:53:18
对不起,我刚才发现我还需要添加“info”以及: passport.use(新的LocalStrategy(函数(用户名,密码,完成)){User.authenticate(username,password,function(err ,user,info){ return done(err,user,info); }); } )); – kurisukun 2013-03-14 02:55:20
这次对话使我得出了一个更具实质性的结论。 https://github.com/jaredhanson/passport/issues/255 – jpierson 2016-01-11 20:43:52