2013-10-01 22 views
26

Tôi tự hỏi chức năng chính của ủy quyền và bắt tay trong Socket.IO là gì. Tôi đã đọc wiki của họ và authorizing guide trên GitHub nhưng tôi vẫn không hiểu những điều sau đây:Ủy quyền và bắt tay với Socket.IO

  1. Giấy phép hoạt động như thế nào trong Socket.io?
  2. Bắt tay trong Socket.IO là gì?
  3. Tôi có thể thêm bất kỳ thứ gì vào đối tượng handshakeData không?

Tôi hy vọng bạn có thể trả lời câu hỏi của tôi. Cảm ơn.

Trả lời

51

Chỉnh sửa: Trong Socket.IO 1.0, phần mềm trung gian hiện được sử dụng. Ủy quyền có thể được thực hiện như sau:

io.use(function(socket, next) { 
    var handshake = socket.request; 
    next(); 
}); 

Nếu bạn đã cần phải loại bỏ các ổ cắm, chỉ cần vượt qua một đối tượng lỗi cho next() gọi lại. Điều tương tự cũng có thể được thực hiện với không gian tên:

io.of('/namespace').use(function(socket, next) { 
    var handshake = socket.request; 
    next(); 
}); 

Authorization trong Socket.IO được điều hành thông qua một chức năng mà được quyết định trong một boolean được thông qua bởi một callback. Chức năng này chạy mỗi khi một kết nối cố gắng một cái bắt tay, và đây là những gì nó trông giống như:

io.set('authorization', function (handshake, callback) { 
    callback(null, true); 
}); 

Chức năng callback() chấp nhận hai tham số. Đầu tiên là lý do lỗi, nếu có, và tham số thứ hai là boolean quyết định liệu một máy khách có thể kết nối hay không. Theo mặc định không có ủy quyền, do đó, kịch bản được hiển thị trong mẫu mã ở trên, nơi mà các ổ cắm được kết nối được cho phép thông qua với true.

Sự bắt tay trong Socket.IO giống như bất kỳ bắt tay liên quan đến công nghệ thông tin nào khác. Đó là quá trình đàm phán, trong trường hợp của Socket.IO, quyết định liệu một khách hàng có thể kết nối hay không, và nếu không, từ chối kết nối. Bắt tay được bắt đầu với yêu cầu XHR hoặc JSONP và không thực hiện được nhiều khi không có ủy quyền được chỉ định, nhưng có thể hữu ích trong dữ liệu được truyền trong đối tượng dữ liệu handshake.

Để trả lời câu hỏi cuối cùng của bạn, có, bạn có thể thêm bất kỳ thứ gì vào đối tượng handshake. Các đối tượng là tài liệu tham khảo biến cùng với đối tượng socket.handshake, cho phép bạn để làm những việc như thế này:

io.set('authorization', function (handshake, callback) { 
    handshake.foo = 'bar'; 
    callback(null, true); 
}); 

io.sockets.on('connection', function(socket) { 
    console.log(socket.handshake.foo); // bar 
}); 

này là rất hữu ích, bởi vì bạn có thể lưu trữ các thuộc tính ổ cắm-based. Một cách sử dụng phổ biến cho điều này là với khung Express, nơi người ta có thể xác định ID phiên dựa trên các cookie được thông qua bởi Socket.IO, sau đó một phiên phù hợp có thể được xác định.

+0

Cảm ơn bro. Đây là câu trả lời những gì tôi đang tìm kiếm. :) –

+4

Điều này xứng đáng được nhiều người thích hơn. Thực tế đơn giản là cái bắt tay có sẵn thông qua socket.handshake bên trong các sự kiện socket rất hữu dụng. – Deminetix

+3

Nếu tôi gọi 'next (new Error ('Forbidden'));' - làm thế nào tôi có thể nhận được thông tin về kết nối của tôi đã bị từ chối trong máy khách? Tôi không thể .emit() từ phần mềm trung gian vì 'next (new Error (''))' từ chối giao tiếp. – cadavre

2

Ngay bây giờ tôi đang sử dụng phương pháp đơn giản này:

io.set('authorization', function (handshakeData, accept) { 
    var domain = handshakeData.headers.referer.replace('http://','').replace('https://','').split(/[/?#]/)[0]; 
    if('myDomain.com'==domain) 
    accept(null, true); 
    else 
    return accept('Deny', false); 
}); 
9

Kể từ Socket.io 1.0, Mặc dù có khả năng tương thích ngược nó được khuyến khích để sử dụng "io.sử dụng()" để thêm middleware ad-hoc của bạn, vì vậy ở phía Node Server:

io.use(function(socket, next){ 
    var joinServerParameters = JSON.parse(socket.handshake.query.joinServerParameters); 
    if (joinServerParameters.token == "xxx"){ 
    next();   
    } else { 
    //next(new Error('Authentication error'));     
    } 
    return;  
}); 

Và về phía khách hàng, để thêm thuộc tính của riêng bạn để bắt tay, nó sẽ trông như thế này:

var joinServerParameters = { token: "xxx" };  
var socket = io.connect('url' , {query: 'joinServerParameters=' + JSON.stringify(joinServerParameters) }); 
0

tôi biết rằng nó quá muộn nhưng tôi muốn thêm các thông tin mà tôi tìm thấy bài viết rất tốt về ủy quyền bắt tay sử dụng socket.io.

socket.io authorization

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