在护照js中序列化和反序列化调用时
When Serialize and Deserialize call in passport js
我必须知道 Serialize 和 Deserialize 何时调用,为了测试我已经输入 alert(user.id)
但没有发生任何动作。
我有一些疑问:
user
对象在 passport.serializeUser(function(user, done){...
中收到的来源
- 这里有什么角色扮演
process.nextTick()
- 如何调用回调函数,即
function(req, email, password, done)
,如果我发送多个表单值,例如(姓名、电子邮件、密码、地址、手机)。
代码如下:-
//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);
});
}
});
});
}));
}
序列化发生在您对用户进行身份验证时:
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);
});
请在您的项目中找到这段代码,并检查它是否像上面那样而不像下面这样:
passport.authenticate('local', { session: false })
另请检查您的项目是否使用会话。参见官方文档中的Sessions。
根据我对项目使用Passport.js的了解,我会尽量回答。
首先,在 nodejs 中没有像 alert()
这样的(函数),所以你必须将浏览器的 alert(...)
重命名为 console.log(...)
我看不到你的 app.js 文件,所以我会继续尝试根据我使用 passportjs 的经验回答你的问题。
假设您在 app.js
中有以下内容(顺序很重要,请参阅 here)
var passport = require('passport');
// express-session configs here
// following is invoked on each request.
app.use(passport.initialize());
passport.initialize()
和 passport.session()
在每个请求上被调用,如果找到序列化用户,它们会导致 serializeUser
将用户 ID 加载到 req.user
在服务器中(当使用 mongodb 时,如果用户存在于 mongodb 中)。
passport.session()
在每个请求上调用 deserializeUser
,它使用最初由 [=18= 加载到 req.user
的 user._id
查询 mongodb ] 并在 req.user
中存储有关用户的更多信息。
process.nextTick()
将回调的执行推迟到事件循环的下一次传递。数据库查询本质上是同步的,process.nextTick()
使其异步。有很多关于这个的教程,Google它。
如前所述,app.use(passport.session())
对每个请求运行 deserializeUser
(基本上每个请求 - 如果您在 passport.session()
之后列出您的快速静态路径配置,那么即使是加载静态文件的请求).在我的例子中,我需要在特定路由上进行身份验证,我想进行身份验证,deserializeUser
等仅在用户访问安全路径时发生,因此,我必须设置一个条件来仅调用 passport.session()
当路径匹配特定模式时如下:
app.use(function(req, res, next){
if(req.url.match('/xxxx/secure'))
passport.session()(req, res, next)
else
next(); // do not invoke passport
});
用上面的内容替换 app.use(passport.session())
有帮助。现在只有当用户访问安全路径时,才会调用护照过程,包括 serializeUser
和 deserializeUser
。我不确定以上是否是完美的解决方案,但它极大地帮助减少了用户(反序列化用户)mongodb 的不必要查询量。
不确定你最后一点要问什么。有很多教程展示了如何为本地和社交身份验证实施 passportjs。你应该四处看看。
更多阅读
有关 session
如何加载用户的更多有趣事实,请阅读我在 中的回答。它描述了 Express
的作用? PassportJS
是做什么的?你会很容易地理解工作流程(文档让它变得混乱和模棱两可)。
你的第三点是
如何调用回调函数
function(req, email, password, done), if send multiple form values e.g(name,email,password,address,mobile).
根据我的理解,第 4 个参数作为回调 function.you 不能使用 like 并抛出错误
function(req, email, password, mobile, address, done)
我必须知道 Serialize 和 Deserialize 何时调用,为了测试我已经输入 alert(user.id)
但没有发生任何动作。
我有一些疑问:
user
对象在passport.serializeUser(function(user, done){...
中收到的来源
- 这里有什么角色扮演
process.nextTick()
- 如何调用回调函数,即
function(req, email, password, done)
,如果我发送多个表单值,例如(姓名、电子邮件、密码、地址、手机)。
代码如下:-
//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);
});
}
});
});
}));
}
序列化发生在您对用户进行身份验证时:
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);
});
请在您的项目中找到这段代码,并检查它是否像上面那样而不像下面这样:
passport.authenticate('local', { session: false })
另请检查您的项目是否使用会话。参见官方文档中的Sessions。
根据我对项目使用Passport.js的了解,我会尽量回答。
首先,在 nodejs 中没有像 alert()
这样的(函数),所以你必须将浏览器的 alert(...)
重命名为 console.log(...)
我看不到你的 app.js 文件,所以我会继续尝试根据我使用 passportjs 的经验回答你的问题。
假设您在 app.js
中有以下内容(顺序很重要,请参阅 here)
var passport = require('passport');
// express-session configs here
// following is invoked on each request.
app.use(passport.initialize());
passport.initialize()
和 passport.session()
在每个请求上被调用,如果找到序列化用户,它们会导致 serializeUser
将用户 ID 加载到 req.user
在服务器中(当使用 mongodb 时,如果用户存在于 mongodb 中)。
passport.session()
在每个请求上调用 deserializeUser
,它使用最初由 [=18= 加载到 req.user
的 user._id
查询 mongodb ] 并在 req.user
中存储有关用户的更多信息。
process.nextTick()
将回调的执行推迟到事件循环的下一次传递。数据库查询本质上是同步的,process.nextTick()
使其异步。有很多关于这个的教程,Google它。
如前所述,app.use(passport.session())
对每个请求运行 deserializeUser
(基本上每个请求 - 如果您在 passport.session()
之后列出您的快速静态路径配置,那么即使是加载静态文件的请求).在我的例子中,我需要在特定路由上进行身份验证,我想进行身份验证,deserializeUser
等仅在用户访问安全路径时发生,因此,我必须设置一个条件来仅调用 passport.session()
当路径匹配特定模式时如下:
app.use(function(req, res, next){
if(req.url.match('/xxxx/secure'))
passport.session()(req, res, next)
else
next(); // do not invoke passport
});
用上面的内容替换 app.use(passport.session())
有帮助。现在只有当用户访问安全路径时,才会调用护照过程,包括 serializeUser
和 deserializeUser
。我不确定以上是否是完美的解决方案,但它极大地帮助减少了用户(反序列化用户)mongodb 的不必要查询量。
不确定你最后一点要问什么。有很多教程展示了如何为本地和社交身份验证实施 passportjs。你应该四处看看。
更多阅读
有关 session
如何加载用户的更多有趣事实,请阅读我在 Express
的作用? PassportJS
是做什么的?你会很容易地理解工作流程(文档让它变得混乱和模棱两可)。
你的第三点是
如何调用回调函数
function(req, email, password, done), if send multiple form values e.g(name,email,password,address,mobile).
根据我的理解,第 4 个参数作为回调 function.you 不能使用 like 并抛出错误
function(req, email, password, mobile, address, done)