2013-05-29 29 views
23

Tôi đang sử dụng hộ chiếu để xác thực và xử lý phiên. Tất cả mọi thứ hoạt động tốt cho đến nay. Tôi đã triển khai biểu mẫu "Đăng nhập" để thêm người dùng mới vào ứng dụng. Sau khi người dùng được thêm, tôi muốn đăng nhập tự động.Passport + Node.js/Tự động đăng nhập sau khi thêm người dùng

Cách tốt nhất để đạt được điều này - tôi có nên chuyển hướng đến "/ đăng nhập" bằng thông tin đăng nhập của người dùng hoặc có cách nào khác/tốt hơn (gọi serializeUser) để làm điều đó không?

Cho đến nay tôi nghĩ rằng tôi đã không thực sự hiểu cách "thực hiện" chức năng (trong serializeUser và LocalStrategy) đang làm việc hoặc những gì nó đang làm ...

Đây là mã của tôi:

passport.serializeUser(function(user, done) { 
    done(null, user._id); 
}); 
passport.deserializeUser(function(id, done) { 
    authProvider.findUserById('users', id, function (err, user) { 
     done(err, user); 
    }); 
}); 

passport.use(new LocalStrategy(function(email, password, done) { 
    authProvider.getUserByEmail('users', email, function(error, user){ 
     if(error) { return done(error); } 
     if (!user) { return done(null, false, { message: 'Unknown user ' + email });} 
     if (user.password != password) { return done(null, false);} 
     return done(null, user); 
     }); 
    } 
)); 

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login'}), 
    function(req, res) { res.redirect('/');}); 

app.post('/sign', function(req, res){ 
    authProvider.saveUser(...do stuff), function(error, user){ 
     if(error){ 
      res.redirect('/sign'); 
     } else { 
      res.redirect('/'); 
     } 
    }); 
}); 

Có ai biết cách thực hiện việc này không?

+0

Tại sao tiếp cận chức năng deserialize DB? Không thể nó chỉ trả về được thực hiện (null, id); ? – Se7enDays

Trả lời

10

Vui lòng sử dụng mã từ the @Weston answer bellow, bởi vì nó phổ biến hơn và đơn giản

nên giống như thế này

app.post('/sign', function(req, res){ 
    authProvider.saveUser(...do stuff), function(error, user){ 
     if(error){ 
      res.redirect('/sign'); 
     } else { 
      passport.authenticate('local')(req, res, function() { 
       res.redirect('/account'); 
      }) 
     } 
    }); 
});   

tôi không chắc chắn về tên của chiến lược, nhưng theo mặc định LocalStrategy nên cung cấp tên 'địa phương'

http://passportjs.org/guide/authenticate/

+0

Cảm ơn câu trả lời của bạn nhưng nó không hoạt động. Tôi nhận được "Không được phép". – user937284

+1

Đây là mẫu đang hoạt động - https://gist.github.com/krasu/5688235, đảm bảo tên trường của bạn trong biểu mẫu đăng ký khớp với biểu mẫu đăng nhập – krasu

+0

Trường email phải được đặt tên là tên người dùng - đó là nó. Cảm ơn! – user937284

32

Dựa trên Passport Guidereq.login() được thiết kế cho mục đích chính xác này.

Chức năng này chủ yếu được sử dụng khi người dùng đăng ký, trong đó req.login() có thể được gọi để tự động đăng nhập vào người dùng mới được đăng ký. đang

Sửa đổi krasu của:

app.post('/sign', function(req, res){ 
    authProvider.saveUser(...do stuff), function(error, user){ 
     if (error){ 
      res.redirect('/sign'); 
     } else { 
      req.login(user, function (err) { 
       if (! err){ 
        res.redirect('/account'); 
       } else { 
        //handle error 
       } 
      }) 
     } 
    }); 
}); 

Các lỗi tiềm ẩn từ login() gọi lại sẽ đến từ chức năng serializeUser() của bạn.

+1

Theo liên kết của bạn, tên phương thức là 'login', không phải là' logIn'. – fiddur

+2

'logIn' là API cũ, vẫn là bí danh được chấp nhận và tuân thủ quy ước thư viện trên vỏ lạc đà (tùy thuộc nếu bạn thấy đăng nhập là một hoặc hai từ). Bạn được hoan nghênh cập nhật câu trả lời cho API mới với bản tóm tắt chỉnh sửa tốt, đặc biệt là cho độ tuổi của câu trả lời. – Weston

+0

Và nếu tôi đăng nhập trực tiếp thì sao? Tôi có cần gọi hàm req.login một cách rõ ràng không? –

1

Hãy thử với:

app.post('/sign', function(req, res){ 
    authProvider.saveUser(...do stuff), function(error, user){ 
     passport.authenticate('local', (err, user) => { 
      req.logIn(user, (errLogIn) => { 
       if (errLogIn) { 
        return next(errLogIn); 
       } 
       return res.redirect('/account'); 
      }); 
     })(req, res, next); 
    }); 
}); 
+1

Vâng, tôi đã lãng phí nhiều giờ để tìm hiểu xem điều gì đã xảy ra sai, khi tôi nhận thấy từ mã của bạn mà tôi đã quên để vượt qua '(req, res, tiếp theo)' to 'passport.authenticate()'. –

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