2012-08-25 32 views
8

Tôi muốn thực hiện sessionhandling trên websockets thông qua node.js và socket.io mà không nhất thiết phải sử dụng cookie và tránh express.js, bởi vì cũng phải có khách hàng không chạy trong môi trường trình duyệt. Ai đó đã làm điều này hoặc đã có một số kinh nghiệm với một bằng chứng về khái niệm?Phiên Socket.io không có express.js?

+0

Ví dụ tại http://socket.io/ không sử dụng nhanh, nhưng tôi đoán bạn đã biết điều đó. Bạn cần thêm thông tin gì? –

Trả lời

1

này sẽ hữu ích, https://github.com/LearnBoost/socket.io/wiki/Authorizing

Bạn có thể theo dõi tất cả các biến session và duy nhất xác định người dùng sử dụng một sự kết hợp của sẵn sau trong handshakeData

{ 
    headers: req.headers  // <Object> the headers of the request 
, time: (new Date) +''  // <String> date time of the connection 
, address: socket.address() // <Object> remoteAddress and remotePort object 
, xdomain: !!headers.origin // <Boolean> was it a cross domain request? 
, secure: socket.secure  // <Boolean> https connection 
, issued: +date    // <Number> EPOCH of when the handshake was created 
, url: request.url   // <String> the entrance path of the request 
, query: data.query   // <Object> the result of url.parse().query or a empty object 
} 

ví dụ này có thể giúp cũng , chỉ cần khách hàng không có trình duyệt của bạn cung cấp thông tin theo một cách khác:

SocketIO + MySQL Authentication

+0

Điểm tốt, nếu tôi có thể thêm một sessionid vào req.headers trên clientside và xác nhận điều này tại ủy quyền. Vì vậy tôi phải viết một sessionhandler độc lập tách ra khỏi req và res vars. Có lẽ tôi có thể sử dụng kết nối-phiên làm codebase để tương thích với các sessionstores và những thứ khác. Bạn có biết cách tôi có thể thêm giá trị vào tiêu đề ở phía máy khách không? Khi kết nối websocket của tôi được ủy quyền, nó có an toàn như một yêu cầu http duy nhất xác thực phiên của anh ấy mọi lúc không? –

3

Trước khi kết nối socket.io được thiết lập, có một cơ chế bắt tay, theo mặc định, tất cả các yêu cầu đến đúng đều bắt tay thành công. Tuy nhiên có một phương pháp để lấy dữ liệu socket trong khi bắt tay và trả về true hoặc false tùy thuộc vào lựa chọn của bạn chấp nhận hoặc từ chối yêu cầu kết nối đến. Dưới đây là ví dụ từ tài liệu socket.io:

Vì handshakeData được lưu trữ sau khi ủy quyền, bạn thực sự có thể thêm hoặc xóa dữ liệu khỏi đối tượng này.

var io = require('socket.io').listen(80); 

io.configure(function(){ 
    io.set('authorization', function (handshakeData, callback) { 
    // findDatabyip is an async example function 
    findDatabyIP(handshakeData.address.address, function (err, data) { 
     if (err) return callback(err); 

     if (data.authorized) { 
     handshakeData.foo = 'bar'; 
     for(var prop in data) handshakeData[prop] = data[prop]; 
     callback(null, true); 
     } else { 
     callback(null, false); 
     } 
    }) 
    }); 
}); 

Đối số đầu tiên của callback chức năng là lỗi, bạn có thể cung cấp một chuỗi ở đây, mà sẽ tự động từ chối khách hàng nếu không được thiết lập để null. Đối số thứ hai là boolean, cho dù bạn muốn chấp nhận yêu cầu đến hay không.

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