socket.io和会话?
我正在使用快速框架。 我想从socket.io到达会话数据。 我尝试使用client.listener.server.dynamicViewHelpers数据快速dynamicHelpers,但我无法获取会话数据。 有一个简单的方法来做到这一点? 请参阅代码
app.listen(3000); var io = require('socket.io'); var io = io.listen(app); io.on('connection', function(client){ // I want to use session data here client.on('message', function(message){ // or here }); client.on('disconnect', function(){ // or here }); });
这对于通过flashsocket传输的套接字(它不会向服务器发送所需的cookie)不起作用,但对于其他任何事情都是可靠的。 我只是在我的代码禁用闪存传输。
为了使它工作,在express / connect方面,我明确地定义了会话存储,所以我可以在socket中使用它:
MemoryStore = require('connect/middleware/session/memory'), var session_store = new MemoryStore(); app.configure(function () { app.use(express.session({ store: session_store })); });
然后在我的套接字代码中,我包含了连接框架,所以我可以使用它的cookieparsing来从cookie中检索connect.sid。 然后,我在具有connect.sid的会话存储中查找会话,如下所示:
var connect = require('connect'); io.on('connection', function(socket_client) { var cookie_string = socket_client.request.headers.cookie; var parsed_cookies = connect.utils.parseCookie(cookie_string); var connect_sid = parsed_cookies['connect.sid']; if (connect_sid) { session_store.get(connect_sid, function (error, session) { //HOORAY NOW YOU'VE GOT THE SESSION OBJECT!!!! }); } });
然后可以根据需要使用该会话。
Socket.IO-sessions模块解决scheme通过在客户端(脚本)级别公开会话ID将应用程序暴露给XSS攻击。
请检查此解决scheme (对于Socket.IO> = v0.7)。 在这里看到文档。
我build议不要完全重新发明轮子。 你需要的工具已经是一个npm包。我认为这是你需要的: session.socket.io我在这几天使用它,这将是非常有帮助,我猜! 将express-session连接到socket.io层将具有很多优点!
编辑:在尝试了一些不起作用的模块之后,我已经写下了自己的库来完成这个工作。 无耻的插件:去检查在https://github.com/aviddiviner/Socket.IO-sessions 。 为了历史的目的,我将把我的旧post留在下面:
根据pr0zac上面的解决scheme,我没有必要绕过闪存传输器,这样我的工作非常整齐。 我也用Socket.IO express。 就是这样。
首先,将会话ID传递给视图:
app.get('/', function(req,res){ res.render('index.ejs', { locals: { connect_sid: req.sessionID // ... } }); });
然后在您的视图中,将其与Socket.IO客户端链接:
<script> var sid = '<%= connect_sid %>'; var socket = new io.Socket(); socket.connect(); </script> <input type="button" value="Ping" onclick="socket.send({sid:sid, msg:'ping'});"/>
然后在你的服务器端的Socket.IO监听器中,读取和写入会话数据:
var socket = io.listen(app); socket.on('connection', function(client){ client.on('message', function(message){ session_store.get(message.sid, function(error, session){ session.pings = session.pings + 1 || 1; client.send("You have made " + session.pings + " pings."); session_store.set(message.sid, session); // Save the session }); }); });
在我的情况下,我的session_store
是Redis,使用redis-connect
库。
var RedisStore = require('connect-redis'); var session_store = new RedisStore; // ... app.use(express.session({ store: session_store }));
希望这可以帮助那些在searchGoogle的过程中发现这篇文章的人(就像我一样;)
看到这个: Socket.IOauthentication
我build议不要通过client.request...
或client.listener...
获取任何东西client.listener...
因为这不是直接附加到client
对象,并始终指向最后login的用户!
检查Socket.IO连接
在Socket.IO节点周围连接WebSocket中间件包装https://github.com/bnoguchi/Socket.IO-connect
这将允许您在使用Socket.IO事件处理程序处理Socket.IO请求之前,将Socket.IO请求推送到Express / Connect中间件堆栈,以便您访问会话,cookie等等。 虽然,我不确定它是否适用于所有的Socket.IO传输。
你可以看看这个: https : //github.com/bmeck/session-web-sockets
或者您也可以使用:
io.on('connection', function(client) { var session = client.listener.server.viewHelpers; // use session here });
希望这可以帮助。
我不确定我是否正确。 https://github.com/LearnBoost/socket.io/wiki/Authorizing
通过握手数据,您可以访问cookie。 在cookies中,你可以获取connect.sid,这是每个客户端的会话ID。 然后使用connect.sid从数据库获取会话数据(我假设你使用的是RedisStore)