2012-07-27 29 views
12

Với phiên bản kết nối mới nhất (kể từ 2012-07-26), tôi đã tìm thấy cách sau để lấy ID phiên từ socket.io sẽ hoạt động với cửa hàng kết nối lại.kết nối socket.io parse (> = 2.4.1) cookie phiên đã ký

var express = require('express') 
, routes = require('./routes') 
, fs = require('fs') 
, http = require('http') 
, io = require('socket.io') 
, redis = require('connect-redis') 
, connect = require('express/node_modules/connect') 
, parseSignedCookie = connect.utils.parseSignedCookie 
, cookie = require('express/node_modules/cookie'); 

var secret = '...'; 
var rStore = new(require('connect-redis')(express)); 

//... 

var server = http.createServer(app); 
var sio = io.listen(server); 

sio.set('authorization', function(data, accept) { 
    if(data.headers.cookie) { 
     data.cookie = cookie.parse(data.headers.cookie); 
     data.sessionID = parseSignedCookie(data.cookie['connect.sid'], secret); 
    } else { 
     return accept('No cookie transmitted', false); 
    } 
    accept(null, true); 
}); 

data.sessionID sau đó có thể được sử dụng sau này như

sio.sockets.on('connection', function(socket) { 
    console.log('New socket connection with ID: ' + socket.handshake.sessionID); 
    rStore.get(socket.handshake.sessionID, function(err, session) { 
     //... 
    }); 
}); 

Có phải nhập khẩu rất nhiều từ nhanh (kết nối, một tiện ích của kết nối, và các mô-đun cookie) có vẻ như một cách quá vòng xoay của nhận các chức năng cần thiết để phân tích các cookie đã ký của kết nối. Có ai tìm thấy một cách khác?

+2

Tôi ước gì có thể upvote này 100 lần. Giải pháp của bạn ở trên đã tiết kiệm cho tôi rất nhiều thời gian, cảm ơn bạn đã đăng nó! Tôi xin lỗi tôi không thể đề nghị một cách khác. – LDK

Trả lời

6

Tôi đã chạy vào cùng và chỉ viết một mô-đun nhỏ để trừu tượng hóa nó. Đây là cách sử dụng của nó trông như thế nào. Nó được viết và kiểm tra bằng cách sử dụng express 3 vì vậy sẽ hoạt động tốt với kết nối 2.4.x. Xin vui lòng cho tôi biết nếu không.

var SessionSockets = require('session.socket.io') 
    , sessionSockets = new SessionSockets(io, sessionStore, cookieParser); 

sessionSockets.on('connection', function (err, socket, session) { 
    //your regular socket.io code goes here 
}); 

Để biết thêm chi tiết về cách thức hoạt động thấy https://github.com/wcamarao/session.socket.io

Các vấn đề liên quan