vla*_*zam 6 javascript node.js express passport.js
在过去的几天里,我一直在使用Passport.js开发我的第一个用户登录和身份验证系统.很尴尬,我已经完成了它,它的工作原理与预期一致.问题是,即使我已经阅读了大量文章并在线查看了数十个示例,但我似乎并不完全理解代码本身.我没有理解它背后的过程以及它为什么会这样发生的问题.如果你能为我澄清代码的某些部分,我将非常感激.这是工作代码,存储在我的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')));
});
Run Code Online (Sandbox Code Playgroud)
我正在使用MongoDB(用户 - 猫鼬模型).另外,要在我正在使用bcrypt的数据库中存储密码.
我认为这里我不了解的最关键部分是完成回调函数.我可以理解它只是传递了一些值,我知道很多东西要意识到它的第一个参数是错误,第二个参数是数据.不过,我还没有完全掌握它,因为我没有特别提供一个作为参数.例如,如果我有这样的函数:
// 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; });
Run Code Online (Sandbox Code Playgroud)
不过,在我的例子中,我不是指定完成回调的那个.它只是一个必需的回调函数参数,还是与普通中间件中的下一个函数相同,例如:
function middleware (req, res, next) {
next(req.user); // pass the req.user to next middleware
}
Run Code Online (Sandbox Code Playgroud)
另外,Passport.js绑定它处理的用户在哪里?它是否将它绑定到req.user?我怎样才能将它传递给某些视图,例如显示用户名?
我期待着您的反馈!
谢谢!
完成回调
看局部策略的代码:
function Strategy(options, verify) {
...
this._verify = verify;
...
}
Run Code Online (Sandbox Code Playgroud)
verify是策略将使用的函数来验证用户,您已在此处指定它:
passport.use(new LocalStrategy(function (username, password, done) {
// your verification code here
}));
Run Code Online (Sandbox Code Playgroud)
稍后在策略中,您可以找到调用上面步骤中的验证函数的验证方法:
this._verify(username, password, verified);
Run Code Online (Sandbox Code Playgroud)
所以,您现在知道username和password来自done==verified哪里。稍后在代码中,您将done使用 (err, user, info) 参数调用回调。简而言之,done需要完成用户验证的异步过程。
请求用户和视图
是的,你说得对req.user。因此,您可以通过两种方式将其传递给您的视图:
作为函数的参数res.render。查看文档
res.render('some-template', { name: req.user });
Run Code Online (Sandbox Code Playgroud)用作res.locals某种上下文提供程序(现在用户对象将在定义的所有视图中可用app.router)。查看文档
// before app.use(app.router);
app.use(function(req, res, next) {
res.locals.user = req.user;
next();
});
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
4684 次 |
| 最近记录: |