Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取用户ID SoCKI.IO,Passport,膝关节炎 膝关节炎,我使用KOA,PasPr.js和KOA会话来验证用户。 所以它基本上看起来像: // 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());_Javascript_Node.js_Session_Socket.io_Koa - Fatal编程技术网

Javascript 获取用户ID SoCKI.IO,Passport,膝关节炎 膝关节炎,我使用KOA,PasPr.js和KOA会话来验证用户。 所以它基本上看起来像: // 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());

Javascript 获取用户ID SoCKI.IO,Passport,膝关节炎 膝关节炎,我使用KOA,PasPr.js和KOA会话来验证用户。 所以它基本上看起来像: // 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());,javascript,node.js,session,socket.io,koa,Javascript,Node.js,Session,Socket.io,Koa,这很有效。在请求时,我确实有带有用户id的req.user。但在使用套接字时,我可以执行以下操作: io.on('connection', function(socket) { console.log(socket.request.headers.cookie), }); 但当然这只是加密的会话ID,我如何反序列化用户并获取user.ID,就像我在get或post请求时获取req.user时一样 提前谢谢。这是一个很晚的回复,但我希望它对您有用。我花了大约四个小时试图解决这个问题 您将遇到

这很有效。在请求时,我确实有带有用户id的
req.user
。但在使用套接字时,我可以执行以下操作:

io.on('connection', function(socket) {
  console.log(socket.request.headers.cookie),
});
但当然这只是加密的会话ID,我如何反序列化用户并获取user.ID,就像我在get或post请求时获取
req.user
时一样


提前谢谢。

这是一个很晚的回复,但我希望它对您有用。我花了大约四个小时试图解决这个问题

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

您需要迁移到
koa通用会话
,并使用会话存储来跟踪会话。在我看来,这是一个更好的举措。我目前正在使用
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的代码。我希望这有帮助。

我使用正则表达式获取用户ID,然后在数据库中找到。这不是最干净的方法,但效果很好。我只是使用koa会话存储作为passport js的会话

  var cookies = socket.request.headers.cookie;
  var regEx = /passport"\:\{"user"\:"(.+?)"\}/g
  var userIdMatches = regEx.exec(cookies);
看起来Firefox(36版)不发送带有websocket请求的cookie,所以这在那里不起作用。我目前正在研究一种解决方案,其中网页接收一个令牌,套接字可以在每次请求时将该令牌发送回服务器,并通过这些方式进行验证。