获取用户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
访问它。 请记住,您需要安装cookie
和co
模块。
// 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);