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.
Cảm ơn bro. Đây là câu trả lời những gì tôi đang tìm kiếm. :) –
Đ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
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