2016-04-10 22 views
5

Sử dụng passport.js, tôi viết lộ trình theo cách này để tôi có quyền truy cập vào tài liệu MongoDb userDoc. Nhưng, khi làm theo cách này ... passport.serializeUser() sẽ không bao giờ được gọi và đối tượng req sẽ bị thiếu user.Hộ chiếu serializeUser() không được gọi với xác thực này() gọi lại

auth.route('/auth/facebook/callback') 
    .get(function(req, res, next) { 
    passport.authenticate('facebook', function(err, userDoc, info) { 
     if (err) { return next(err); } 
     // I don't think !userDoc will ever happen because of mongo upsert 
     if (!userDoc) { return res.redirect('/login'); } 
     res.cookie('facebookPicUrl', userDoc.value.facebook.picture, {maxAge : 9999999, 
     httpOnly: false, 
     secure: false, 
     signed: false 
     }); 

     res.redirect('http://localhost:9000/users') 
    })(req, res, next); 
    }); 

Nhưng nếu tôi viết nó theo cách này, các req.user là có như nó phải được:

auth.route('/auth/facebook/callback') 
    .get(passport.authenticate('facebook', { failureRedirect: '/login' }), 
     function(req, res) { 
     res.redirect('http://localhost:9000/users') 
    }); 

Làm thế nào tôi có thể làm cho này đến nơi passport.serializeUser được gọi và user tồn tại trên req và tôi cũng có truy cập đối tượng mongoDb?

Trả lời

9

Vì bạn đang sử dụng gọi lại xác thực tùy chỉnh, bạn chịu trách nhiệm thiết lập phiên.

Lưu ý rằng khi sử dụng một callback tùy chỉnh, nó trở nên trách nhiệm của ứng dụng để thiết lập một phiên (bằng cách gọi req.login()) và gửi một phản ứng.

req.login() gán đối tượng user đến đối tượng yêu cầu req như req.user một lần hoạt động đăng nhập hoàn tất.

Bạn có thể xem ví dụ rằng trong tài liệu req.login() được một cách rõ ràng được gọi trong khi gọi lại tùy chỉnh:

app.get('/login', function(req, res, next) { 
    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); 
}); 
+0

Wow! Theo tôi hiểu, điều này không được ghi chép ngay trên trang web Passport.js. Họ nói rằng passport.authenticate() gọi req.login() nhưng tôi không biết rằng nó phải được gọi thủ công nếu cung cấp một cuộc gọi lại tùy chỉnh. Các tài liệu rất mơ hồ! – OzzyTheGiant

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