我使用护照登录并验证用户如下
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' }
答案 0 :(得分:0)
module.exports = function(passport){
passport.serializeUser(function(user, done) {
var object = user.email + ':'+ user.description
done(null, object);
});
passport.deserializeUser(function(object, done) {
var serial = object.split(':'),
email = serial[0]
User.getUserByEmail(email, function(err, user) {
done(err, user);
});
});
App.js中的
app.io.sockets.on('connection', function(socket){
console.log('a user connected');
var userObject = socket.request.session.passport.user.split(':');
socket.username = userObject[0];
socket.userDescription = userObject[1];
这样您就可以将往返保存到数据库中。
ps:这只是一个例子,它没有经过测试或验证,我强烈推荐
希望这有帮助!