2016-01-08 18 views
13

Tôi phải biết khi nào Serialize và Deserialize gọi, để kiểm tra tôi đã đặt alert(user.id) nhưng không có hành động nào xảy ra.Khi Serialize và Deserialize gọi trong hộ chiếu js

Tôi có một số thắc mắc:

  • Từ nơi user đối tượng đã nhận được trong passport.serializeUser(function(user, done){...
  • vai trò gì chơi process.nextTick() đây
  • Làm thế nào để gọi hàm callback tức, function(req, email, password, done), nếu tôi gửi nhiều hình thức giá trị ví dụ (tên, email, mật khẩu, địa chỉ, điện thoại di động).

Đây là mã: -

//config/passport.js 

var LocalStrategy = require('passport-local').Strategy; 

var User   = require('../app/models/user'); 

module.exports = function(passport) { 

    passport.serializeUser(function(user, done) { 
     alert(user.id);//// Here is my testing alert 
     done(null, user.id); 
    }); 

    passport.deserializeUser(function(id, done) { 
     User.findById(id, function(err, user) { 
      done(err, user); 
     }); 
    }); 


passport.use('local-signup', new LocalStrategy({ 
     usernameField : 'email', 
     passwordField : 'password', 
     passReqToCallback : true 
    }, 
    function(req, email, password, done) { 
     process.nextTick(function() { 
     User.findOne({ 'local.email' : email }, function(err, user) { 

      if (err) 
       return done(err); 

      if (user) { 
       return done(null, false, req.flash('signupMessage', 'That email is already taken.')); 
      } else { 
       var newUser   = new User(); 
       newUser.local.email = email; 
       newUser.local.password = newUser.generateHash(password); 
       newUser.save(function(err) { 
        if (err) 
         throw err; 
        return done(null, newUser); 
       }); 
      } 

     });  

     }); 

    })); 
} 

Trả lời

13

Dựa trên kiến ​​thức của tôi về việc sử dụng Passport.js cho một dự án, tôi sẽ cố gắng trả lời hết mức có thể.

Trước hết, không có gì (chức năng) như alert() trong nodejs, vì vậy bạn sẽ phải đổi tên alert(...) của bạn mà là một điều trình duyệt, một cái gì đó giống như console.log(...)

Tôi không thể nhìn thấy tập tin của bạn để app.js , Tôi sẽ tiếp tục và cố gắng trả lời các truy vấn của bạn dựa trên kinh nghiệm sử dụng hộ chiếu của tôi.

Giả sử rằng bạn đã sau trong app.js của bạn (theo thứ tự là quan trọng, xem here)

var passport = require('passport'); 
// express-session configs here 
// following is invoked on each request. 
app.use(passport.initialize()); 

passport.initialize()passport.session() được gọi trên mỗi yêu cầu và họ là những người gây serializeUser để nạp user id để req.user nếu một người dùng tuần tự được tìm thấy trong máy chủ (khi sử dụng mongodb, nếu người dùng tồn tại trong mongodb).

passport.session() gọi deserializeUser trên mỗi yêu cầu, mà truy vấn MongoDB sử dụng user._id mà ban đầu được nạp vào req.user bởi serializeUser và lưu trữ các thông tin thêm về người dùng trong req.user.

process.nextTick() sẽ ngăn chặn việc thực thi cuộc gọi lại cho đến khi vượt qua vòng lặp tiếp theo quanh vòng lặp sự kiện. Truy vấn cơ sở dữ liệu được đồng bộ hóa trong tự nhiên và process.nextTick() làm cho nó không đồng bộ. Có rất nhiều hướng dẫn về điều này, Google nó.

Như đã đề cập trước đó, app.use(passport.session()) chạy deserializeUser trên mỗi yêu cầu (về cơ bản mọi yêu cầu - nếu bạn liệt kê rõ ràng configs con đường tĩnh của bạn sau khi passport.session() sau đó ngay cả đối với những yêu cầu tải file tĩnh).Trong trường hợp của tôi, tôi cần xác thực trên các tuyến cụ thể và tôi muốn thực hiện xác thực, deserializeUser v.v. chỉ xảy ra khi người dùng truy cập đường dẫn an toàn do đó, tôi phải đặt điều kiện để gọi passport.session() chỉ khi đường dẫn khớp với mẫu nhất định như sau :

app.use(function(req, res, next){ 
    if(req.url.match('/xxxx/secure')) 
    passport.session()(req, res, next) 
    else 
    next(); // do not invoke passport 
}); 

Thay thế app.use(passport.session()) bằng cách trên. Bây giờ chỉ khi người dùng truy cập đường dẫn an toàn, quy trình hộ chiếu được gọi bao gồm serializeUserdeserializeUser. Tôi không chắc chắn nếu ở trên là giải pháp hoàn hảo nhưng, nó giúp rất nhiều trong việc giảm số lượng truy vấn không cần thiết của mongodb cho người dùng (deserializeUser).

Không chắc bạn đang hỏi điều gì ở điểm cuối cùng của bạn. Có khá một vài hướng dẫn cho thấy làm thế nào để thực hiện passportjs cho auth địa phương cũng như xã hội. Bạn nên có một cái nhìn xung quanh.

ĐỌC THÊM

Đối với sự kiện thú vị hơn về cách các session được nạp với người sử dụng, đọc câu trả lời của tôi trong SO question này. Nó mô tả những gì Express làm gì? những gì PassportJS không? và bạn sẽ hiểu quy trình làm việc một cách dễ dàng (tài liệu làm cho nó khó hiểu và mơ hồ).

+0

Tôi có một câu hỏi, khi bạn nói: "passport.initialize() và passport.session() ... họ là những người gây ra serializeUser để tải id người dùng ** để req.user nếu một người dùng serialized được tìm thấy trong máy chủ (whe n sử dụng mongodb, nếu người dùng tồn tại trong mongodb). ** "Id người dùng đến từ đâu và khi bạn nói" nếu người dùng tồn tại trong mongodb ", Liệu nó có tự động tìm trong Mô hình người dùng không? –

+0

Trình tái cấu trúc mã của bạn có thể là' if (req.url.match ('/ xxx ')) passport.session(); next(); ' – NERDYLIZARD

0

serialization xảy ra khi bạn xác thực người dùng:

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); 
}); 

Hãy tìm mã này trong bạn dự án và kiểm tra xem nó trông giống như ở trên và không như bên dưới:

passport.authenticate('local', { session: false }) 

Đồng thời vui lòng kiểm tra các phiên sử dụng dự án. Xem Sessions trong tài liệu chính thức.

3

điểm thứ 3 của bạn là

Làm thế nào để gọi hàm callback

function(req, email, password, done), if send multiple form values e.g(name,email,password,address,mobile). 

Theo hiểu biết của tôi, lập luận lần thứ 4 diễn như một cuộc gọi trở lại function.you không thể sử dụng như và ném lỗi

function(req, email, password, mobile, address, done) 
Các vấn đề liên quan