Ответ 1
Изменить: В Socket.IO 1.0 теперь используется промежуточное программное обеспечение. Авторизация может быть выполнена следующим образом:
io.use(function(socket, next) {
var handshake = socket.request;
next();
});
Если вам нужно будет отклонить сокет, просто передайте объект ошибки в обратный вызов next()
. То же самое можно сделать с пространствами имен:
io.of('/namespace').use(function(socket, next) {
var handshake = socket.request;
next();
});
Авторизация в Socket.IO запускается через функцию, которая определяется логическим значением, которое передается обратным вызовом. Эта функция запускается каждый раз, когда соединение пытается выполнить рукопожатие, и это выглядит так:
io.set('authorization', function (handshake, callback) {
callback(null, true);
});
Функция callback()
принимает два параметра. Во-первых, причина ошибки, если она есть, а второй параметр - логическое значение, которое решает, может ли клиент подключиться или нет. По умолчанию авторизация отсутствует, поэтому сценарий показан в примере кода выше, где сокет, который подключается, разрешен с помощью true
.
Рукопожатие в Socket.IO похоже на любое другое рукопожатие, связанное с информационной технологией. Это процесс согласования, который в случае Socket.IO решает, может ли клиент подключиться, а если нет, то отрицает соединение. Рукопожатие инициируется либо запросом XHR, либо JSONP, и не делает многого, когда не задано разрешение, но может быть полезно в данных, переданных в объекте данных handshake
.
Чтобы ответить на ваш последний вопрос, да, вы можете добавить что-нибудь в объект handshake
. Объект - это та же переменная, что и объект socket.handshake
, который позволяет вам делать такие вещи:
io.set('authorization', function (handshake, callback) {
handshake.foo = 'bar';
callback(null, true);
});
io.sockets.on('connection', function(socket) {
console.log(socket.handshake.foo); // bar
});
Это очень полезно, потому что вы можете хранить свойства на основе сокетов. Общепринятое использование этого заключается в структуре Express, где можно идентифицировать идентификатор сеанса на основе файлов cookie, передаваемых Socket.IO, которые затем можно идентифицировать соответствующий сеанс.