xin lỗi, tôi rất mới đối với node.js vì vậy tôi chưa thể kết thúc đầu của mình xung quanh vấn đề này. Tôi đang sử dụng Node.js làm máy chủ API phụ trợ cho máy khách iPhone. Tôi đang sử dụng Passport.js để xác thực bằng chiến lược Địa phương. Các mã có liên quan là dưới đây:Gửi lại phản hồi JSON khi không xác thực 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);
});
});
});
và
// 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('/');
});
Ngay bây giờ, tôi đã quản lý để chuyển hướng một tên đăng nhập thất bại trong việc/loginfail, nơi tôi gửi lại một số JSON cho khách hàng iPhone. Tuy nhiên, điều này không có đủ chi tiết. Tôi muốn có thể gửi lại các lỗi thích hợp cho ứng dụng khách iPhone, chẳng hạn như: "Không tìm thấy người dùng" hoặc "Mật khẩu sai". Với mã hiện tại của tôi, tôi không thấy làm thế nào điều này có thể được thực hiện.
Tôi đã cố gắng làm theo các ví dụ cho một cuộc gọi lại tùy chỉnh trên trang web passport.js, nhưng tôi không thể làm cho nó hoạt động do thiếu sự hiểu biết về nút. Làm cách nào tôi có thể sửa đổi mã của mình để tôi có thể gửi lại tệp res.json với mã/thông báo lỗi thích hợp?
EDIT: Tôi đang cố gắng một cái gì đó như thế này bây giờ:
// 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);
});
});
});
Nhưng trở lại khi tôi cố gắng console.log (thông tin), nó chỉ nói không xác định. Tôi không biết làm thế nào để có được gọi lại tùy chỉnh này làm việc ... Bất kỳ trợ giúp sẽ được đánh giá cao!
Cảm ơn bạn cho việc này. Tôi nhận thức được gọi lại tùy chỉnh, nhưng vấn đề của tôi là tôi chỉ không hiểu làm thế nào để thực hiện nó (xin lỗi rất mới đến nút và js). Tôi đã chỉnh sửa câu hỏi của mình với những nỗ lực mới nhất của tôi. Như bạn có thể thấy, tôi đang cố gắng sử dụng thông số "thông tin" này, nhưng tôi không biết cách sử dụng nó một cách chính xác - nó luôn luôn không được xác định khi tôi lấy lại từ xác thực. – kurisukun
Xin lỗi, tôi đã chỉ ra rằng tôi cần phải thêm "thông tin" vào điều này: passport.use (new LocalStrategy (chức năng (tên người dùng, mật khẩu, đã hoàn tất) { User.authenticate (tên người dùng, mật khẩu, chức năng (err) , người dùng, thông tin) { trả lại xong (err, người dùng, thông tin); }); } )); – kurisukun
Cuộc trò chuyện này đã giúp tôi đi đến cùng một kết luận với một chút chất hơn. https://github.com/jaredhanson/passport/issues/255 – jpierson