首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取用户id socket.io、passport、koa

获取用户id socket.io、passport、koa
EN

Stack Overflow用户
提问于 2014-10-30 09:05:10
回答 2查看 2.7K关注 0票数 5

我使用Koa、Passport.js和koa-session对用户进行身份验证。所以它基本上看起来像这样:

代码语言:javascript
运行
复制
// 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());

这样做效果很好。在请求时,我有用户id的req.user。但是在使用套接字时,我可以这样做:

代码语言:javascript
运行
复制
io.on('connection', function(socket) {
  console.log(socket.request.headers.cookie),
});

但它当然只是加密的会话ID,我如何反序列化用户并获得user.id,就像在get或post请求中获得req.user时所做的那样?

提前谢谢你。

EN

回答 2

Stack Overflow用户

发布于 2014-12-28 15:04:59

这是一个非常晚的回复,但我希望它能对你有所帮助。我刚刚花了大约四个小时来解决这个问题。

您将遇到的第一个问题是koa-session不使用真正的会话存储。它将所有信息嵌入到cookie本身中,然后解析来往于客户端的信息。虽然这可能很方便,但在尝试合并Socket.IO时,它对您不利,因为Socket.IO无法访问koa-session

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

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

代码语言:javascript
运行
复制
// 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);
}

在此之后,初始设置就很简单了。

代码语言:javascript
运行
复制
// 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模块。

代码语言:javascript
运行
复制
// 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的代码。我希望这能帮到你。

票数 11
EN

Stack Overflow用户

发布于 2015-06-24 02:28:30

我使用正则表达式获取userId,然后在我的数据库中找到它。这不是最干净的方法,但它工作得很好。我只是使用koa- session -store作为我与passport js的会话。

代码语言:javascript
运行
复制
  var cookies = socket.request.headers.cookie;
  var regEx = /passport"\:\{"user"\:"(.+?)"\}/g
  var userIdMatches = regEx.exec(cookies);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26643370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档