Passport.js用户login和身份validation

在过去的几天中,我一直在使用Passport.js开发我的第一个用户login和authentication系统。 尴尬的是,我已经完成了它,它的工作原理是一样的。 问题是,即使我已经阅读了大量的文章,并在网上查了几十个例子,我似乎并没有完全理解代码本身。 我没有理解它背后的过程,为什么它必须像那样发生。 我真的很感激,如果你能澄清我的代码的一些部分。 这是工作代码,存储在我的app.js文件中:

// Passport session setup passport.serializeUser(function (user, done) { done(null, user._id); }); passport.deserializeUser(function (id, done) { User.findById(id, function(err, user) { done(err, user); }); }); // Use the Local Strategy within passport 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' }); } }); }); })); var app = module.exports = express(); app.configure(function () { app.set('views', path.join(__dirname + '/views')); app.set('view engine', 'html'); app.engine('html', hbs.__express); app.use(express.logger()); app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.session({ secret: 'xxx' })); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(express.static(path.join(__dirname + '/public'))); }); 

我正在使用MongoDB(用户 – mongoose模型)。 此外,要将密码存储在数据库中,我正在使用bcrypt。

我认为这里我不了解的最关键的部分是完成的callback函数。 我可以理解,它只是传递了一些价值观,我知道这很多要意识到,它的第一个参数是错误,第二个数据。 不过,我并没有完全理解,因为我没有专门提供一个作为参数。 例如,如果我有这样的function:

 // Random Function var randomFunction = function (a, b, done) { done(a, b); }; // Then I would call the randomFunction providing my own **done** randomFunction('Random', 'Words', function(a, b) { return a + b; }); 

不过,在我的例子中,我不是指定完成callback的人。 它只是一个必需的callback函数参数,还是与普通中间件中的下一个函数相同,如:

 function middleware (req, res, next) { next(req.user); // pass the req.user to next middleware } 

另外,Passport.js在哪里绑定它处理的用户呢? 它绑定到req.user ? 而我怎样才能把它传递给某些视图,例如,显示用户名?

我期待您的反馈!

谢谢!

完成callback

看看本地策略的代码:

 function Strategy(options, verify) { ... this._verify = verify; ... } 

verify是策略将用于validation用户的function,并在此处指定:

 passport.use(new LocalStrategy(function (username, password, done) { // your verification code here })); 

稍后在策略中,您可以从上面的步骤中find调用validation函数的validation方法:

 this._verify(username, password, verified); 

所以,你现在看到usernamepassworddone==verified来自哪里。 后来在你的代码中,你会用(err,user,info)参数调用donecallback函数。 简而言之, done用户validation的asynchronous过程需要完成。

req.user和views

是的,你对req.user是正确的。 所以你可以通过两种方式将它传递给你的观点:

  1. 作为res.render函数的一个参数。 看文档

     res.render('some-template', { name: req.user }); 
  2. 使用res.locals作为某种上下文提供者(现在用户对象将在app.router中定义的所有视图中app.router )。 看文档

     // before app.use(app.router); app.use(function(req, res, next) { res.locals.user = req.user; next(); });