Подтвердить что ты не робот

Авторизация и подтверждение связи с помощью Socket.IO

Мне интересно, какая основная функция авторизации и рукопожатие в Socket.IO есть. Я уже прочитал их wiki и руководство по настройке на GitHub, но я до сих пор не понимаю следующее:

  • Как работает авторизация в Socket.io?
  • Что такое рукопожатие в Socket.IO?
  • Можно ли добавить что-нибудь к объекту handshakeData?

Надеюсь, ты сможешь ответить на мой вопрос. Спасибо.

4b9b3361

Ответ 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, которые затем можно идентифицировать соответствующий сеанс.

Ответ 2

Так как Socket.io 1.0, хотя есть обратная совместимость, рекомендуется использовать "io.use()", чтобы добавить ваше промежуточное ПО adware, поэтому на стороне сервера Node:

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;       
});

И на стороне клиента, чтобы добавить свой собственный атрибут к рукопожатию, он будет выглядеть следующим образом:

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

Ответ 3

Сейчас я использую этот простой метод:

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);
});

Ответ 4

Я знаю, что это слишком поздно, но я хотел бы добавить информацию, где я нашел очень хорошую статью о авторизации рукопожатия, используя socket.io.

разрешение socket.io