對不起,我對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