获取用户ID socket.io,护照,koa

我正在使用Koa,Passport.js和koa会话来validation用户。 所以它基本上是这样的:

// session var session = require('koa-session'); app.keys = [config.secret]; app.use(session()); // auth require(__dirname+'/lib/auth'); // de/serializeUser, strategies etc.. var passport = require('koa-passport'); app.use(passport.initialize()); app.use(passport.session()); 

这很好。 在请求我有req.user ,与用户ID。 但是,当使用套接字时,我可以这样做:

 io.on('connection', function(socket) { console.log(socket.request.headers.cookie), }); 

但是,当然,这只是encryption的会话ID,我怎么能反序列化的用户,并得到user.id就像我得到req.user得到或请求后?

先谢谢你。

这是一个非常晚的反应,但我希望它会对你有用。 我只花了大约四个小时试图解决这个问题。

你会遇到的第一个问题是koa-session不使用真正的会议商店。 它将所有信息embedded到cookie本身中,然后将其parsing到客户端。 虽然这样可以很方便,但是当试图合并Socket.IO时,它会对你Socket.IO ,因为Socket.IO不能访问koa-session

您需要迁移到koa-generic-session并使用会话存储来跟踪会话。 在我看来,这是一个更好的举措。 我目前正在使用koa-redis作为我的会议商店。

为了能够访问Socket.IO的会话,您需要设置一个全局存储。 这是我的全球商店的样子。

 // store.js var RedisStore = require('koa-redis'), store = undefined; // global module.exports = function(app, settings) { // Where (app) is Koa and (settings) is arbitrary information return (function(app, settings) { store = store || new RedisStore(); return store; })(app, settings); } 

之后,初始设置很简单。

 // app.js ... arbitrary code here ... var session = require('koa-generic-session'); app.keys = [config.secret]; app.use(session({ store: require('./store')(app, settings) })); ... arbitrary code here ... 

现在您已经拥有全局会话存储,然后可以在Socket.IO访问它。 请记住,您需要安装cookieco模块。

 // io.js var cookie = require('cookie'), co = require('co'), store = require('./store')(null, settings); // We don't require the Koa app io.use(function(socket, next){ // Now you will need to set up the authorization middleware. In order to // authenticate, you will need the SID from the cookie generated by // koa-generic-session. The property name is by default 'koa.sid'. var sid = cookie.parse(socket.handshake.headers.cookie)['koa.sid']; // We need co to handle generators for us or everything will blow up // when you try to access data stores designed for Koa. co(function*(){ // 'koa:sess:' is the default prefix for generic sessions. var session = yield store.get('koa:sess:' + sid); // At this point you can do any validation you'd like. If all is well, // authorize the connection. Feel free to add any additional properties // to the handshake from the session if you please. if (session) next(null, true) // authenticated else throw new Error('Authentication error.'); }); }); io.on('connection', function(socket){ // Access handshake here. }); 

我已经调整了Socket.IO v1的代码。 我希望这有帮助。

我用正则expression式来抓取userId,然后在我的数据库中find。 不是最干净的方法,但效果很好。 我只是使用koa会话商店作为与护照js的会话。

  var cookies = socket.request.headers.cookie; var regEx = /passport"\:\{"user"\:"(.+?)"\}/g var userIdMatches = regEx.exec(cookies);