【发布时间】:2016-10-31 11:11:35
【问题描述】:
我正在使用护照登录并验证用户如下
passport.js
module.exports = function(passport){
passport.serializeUser(function(user, done) {
done(null, user.email);
});
passport.deserializeUser(function(email, done) {
User.getUserByEmail(email, function(err, user) {
done(err, user);
});
});
在我的 app.js
app.io.sockets.on('connection', function(socket){
console.log('a user connected');
var userEmail = socket.request.session.passport.user;
socket.username = userEmail;
现在我知道 req.user 将填充所有用户信息,但我想在 app.io.sockets.on('connection') 代码中提取 user.description 信息,就像处理电子邮件一样。但是,电子邮件是唯一被传递的东西。
所以我也在想 a) 我应该更改我的 passport.js
passport.serializeUser(function(user, done) {
done(null, user);
});
所以它将整个用户对象返回给socket.request.session.passport.user;这似乎不安全(因为密码哈希和其他所有内容都将被传递)(除非有一种方法可以在没有整个对象的情况下将 user.email 和 user.description 传递给 done()?
或 b) 使用用户的电子邮件在 app.io.sockets.on('connection') 中查找 findOne
哪个是正确的解决方案,或者有更好的方法来提取一个不是电子邮件/ID的特定用户字段。
编辑 1 更新:
passport.js 本地登录策略
// Login
passport.use('local-login', new LocalStrategy({
// changing default username field to email
usernameField: 'email',
passReqToCallback: true
},
....
socket.request.session.passport 变量如下所示
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
flash: {},
passport: { user: 'myemail@gmail.com' } }
编辑 2 更新:
好的,我想我想出一个更好的方法是在我的 app.js 中执行此操作
// and user description to pass into our socket session
app.use(function(req, res, next){
if (req.user){
req.session.description = req.user.description;
}
next();
});
这样会显示如下
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
flash: {},
passport: { user: 'email@gmail.com' },
description: 'Random Description' }
【问题讨论】:
-
sockets,在编程级别上,与socket.io无关...我删除了标签。有关详细信息,请参阅sockets 标签详细信息。
标签: javascript node.js socket.io passport.js