2014-10-07 20 views
5

Theo the documentation, nếu tôi xử lý các yêu cầu xác thực như vậy, tôi sẽ có thể nắm bắt các lần thử thành công.Cách xử lý các yêu cầu trái phép với nodejs/hộ chiếu

app.post('/login', 
    passport.authenticate('local'), 
    function(req, res) { 
    // If this function gets called, authentication was successful. 
    // `req.user` contains the authenticated user. 
    res.redirect('/users/' + req.user.username); 
    }); 

Nhưng, như các tài liệu nói:

Theo mặc định, nếu thẩm định thất bại, Hộ chiếu sẽ phản ứng với một tình trạng trái phép 401, và bất cứ xử lý tuyến đường bổ sung sẽ không được gọi. Nếu xác thực thành công, trình xử lý tiếp theo sẽ được gọi và thuộc tính req.user sẽ được đặt thành người dùng được xác thực.

Tôi có thể xử lý nỗ lực đăng nhập trái phép như thế nào?

Tôi biết tôi có thể xử lý nó bằng phần mềm trung gian tùy chỉnh nhưng có cách nào tốt hơn không?

Trả lời

10

Bạn nên xem phần Tùy chỉnh gọi lại trong passport docs giải thích cách ghi đè hành vi xây dựng trong xử lý yêu cầu xác thực. Bạn có thể viết một cuộc gọi lại tùy chỉnh sẽ phục vụ mục đích của hàm done mà bạn đang gọi từ Chiến lược.

app.get('/login', function(req, res, next) { 
    /* look at the 2nd parameter to the below call */ 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); 
}); 

Nhìn vào tham số thứ hai đến passport.authenticate cuộc gọi, mà sẽ đóng vai trò chức năng làm được điều đó bạn gọi từ chiến lược địa phương.

Xem hàm thực hiện được gọi trong mã bên dưới, chiến lược địa phương mà bạn xác định cho hộ chiếu. Bạn có thể gọi hàm được thực hiện với các tham số có sẵn khác nhau như err, user, info đặt từ chiến lược theo phản hồi từ cuộc gọi API hoặc hoạt động db. các thông số này sẽ được xử lý theo định nghĩa hàm ở trên trong cuộc gọi passport.authenticate.

passport.use(new LocalStrategy(
    function(username, password, done) { 
    /* see done being invoked with different paramters 
     according to different situations */ 
    User.findOne({ username: username }, function (err, user) { 
     if (err) { return done(err); } 
     if (!user) { return done(null, false); } 
     if (!user.verifyPassword(password)) { return done(null, false); } 
     return done(null, user); 
    }); 
    } 
)); 
+1

cảm ơn, hoạt động tuyệt vời – Joseph

Các vấn đề liên quan