2013-08-09 46 views
9

Vì vậy, tôi đang sử dụng hộ chiếu địa phương và thể hiện để xử lý đăng nhập của người dùng. Cho đến nay tôi đã có thể đăng nhập thành công khi sử dụng tên người dùng nhưng tên người dùng rất khó nhớ và cá nhân tôi không nghĩ rằng họ nên được sử dụng để xử lý người dùng, vì vậy tôi đã thử sửa đổi Chiến lược mẫu được cung cấp trên hộ chiếu- trang địa phương để xác nhận người dùng qua email nhưng mã không hoạt động.Sử dụng email với Hộ chiếu địa phương. Trợ giúp trước đó không hoạt động

Chiến lược tôi có cho email là:

passport.use(new LocalStrategy(function(email, password, done) { 
    User.findOne({ email: email }, {}, function(err, user) { 
    if (err) { return done(err); } 
    if (!user) { return done(null, false, { message: 'Unknown user ' + e }); } 
    user.comparePassword(password, function(err, isMatch) { 
     if (err) return done(err); 
     if(isMatch) { 
     return done(null, user); 
     } else { 
     return done(null, false, { message: 'Invalid password' }); 
     } 
    }); 
    }); 
})); 

Và Nó bắt nguồn từ chiến lược này:

//The login strategy 
passport.use(new LocalStrategy(function(username, password, done) { 
    User.findOne({ username: username }, function(err, user) { 

    if (err) { return done(err); } 
    if (!user) { return done(null, false, { message: 'Unknown user ' + username }); } 
    user.comparePassword(password, function(err, isMatch) { 
     if (err) return done(err); 
     if(isMatch) { 
     return done(null, user); 
     } else { 
     return done(null, false, { message: 'Invalid password' }); 
     } 
    }); 
    }); 
})); 

Vì vậy, chiến lược tên làm việc hoàn toàn tốt đẹp, nhưng email người ta không là. Tôi thậm chí còn để lại một console.log() trong cả tên người dùng và chiến lược email để xem chiến lược nào đã trở lại. Chiến lược Tên đăng nhập trả về tất cả các thông tin về người sử dụng, trong khi các chiến lược email trả

sai

. Tôi không biết tại sao trang web lại làm điều này và không có giải pháp nào mà tôi đã thấy cho đến nay.

Một giải pháp tôi đã nhìn thấy trên bài khác gợi ý rằng tôi chỉ sử dụng các tùy chọn

findOne({email: email}, function(err, user){ 
}); 

đăng nhập bằng email để tìm ra người sử dụng, nhưng nó đã không được làm việc ở tất cả.

Dưới đây là file Jade tôi sử dụng để lấy đầu vào từ người sử dụng:

extends layout 

block content 
    h1 Login 

    form(action= '/login', method='post') 
     p Email 
      br 
      input#email(type='text',value='',placeholder='@',name='email') 
     p Password 
      br 
      input#password(type='password',value='',placeholder='Password',name='password') 
     input(type='submit') Submit 

Và đây là POST đầu vào:

// POST /login 
// This is an alternative implementation that uses a custom callback to 
// acheive the same functionality. 
exports.postlogin = function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err) } 
    if (!user) { 
     req.session.messages = [info.message]; 
     return res.redirect('/login') 
    } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/'); 
    }); 
    })(req, res, next); 
}; 

Cái quái gì đang xảy ra ở đây? Với email, nó sẽ hoạt động hoàn hảo. Kể từ khi tôi hỏi một câu hỏi nào, làm thế nào để tôi xác nhận email sau khi ai đó đã đăng ký?

Trả lời

32

Dường như với tôi bạn vừa thay đổi tên của đối số trong gọi lại LocalStrategy thành "email". Hộ chiếu không tự động biết rằng trường được đặt tên là email mặc dù, bạn phải nói với nó.

Theo mặc định, LocalStrategy hy vọng tìm thông tin xác thực trong các tham số có tên người dùng và mật khẩu. Nếu trang web của bạn thích đặt tên cho các trường này khác nhau, các tùy chọn có sẵn để thay đổi các giá trị mặc định.

passport.use(new LocalStrategy({ 
    usernameField: 'email', 
    passwordField: 'passwd' 
    }, 
    function(username, password, done) { 
    // ... 
    } 
)); 

Source

+5

Tôi thề có phép thuật trong lưu lượng truy cập.Lâu nhất tôi đã cố gắng để làm việc với vấn đề này. Tôi thậm chí đã thử ví dụ bạn đã đăng trước đó, không có gì làm việc cho đến bây giờ. Cảm ơn nhiều! – Kivo360

+0

'passwordField' phải là' mật khẩu' imo –

0

hộ chiếu là một chút phức tạp để hiểu được. Tôi đã có cùng một vấn đề, những gì tôi đã làm là theo quan điểm của tôi (.ejs) thay vì đặt tên đầu vào là "email" tôi chỉ đổi tên thành "tên người dùng", vì đó là những gì hộ chiếu mong đợi.

Email

Cảm ơn!