Аутентификация сокета io соединения

Как я могу аутентифицировать socket.io соединение? Мое приложение использует конечную точку входа в систему с другого сервера (Python) для получения маркера, как я могу получить использование, что маркер каждый раз, когда пользователь открывает сокетное соединение на стороне узла?

io.on('connection', function(socket) {
    socket.on('message', function(message) {
        io.emit('message', message);
    });
});

И сторона клиента:

var token = sessionStorage.token;
var socket = io.connect('http://localhost:3000', {
    query: 'token=' + token
});

Если маркер создается в Python:

token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')

Как я могу использовать этот маркер для аутентификации сокетного соединения в узле?

62
задан 22 April 2016 в 11:33

2 ответа

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

Реализация с jsonwebtoken модуль

клиент

var token = sessionStorage.token;
var socket = io.connect('http://localhost:3000', {
  query: {token: token}
});

Сервер

var io = require('socket.io')();
var jwt = require('jsonwebtoken');

io.use(function(socket, next){
  if (socket.handshake.query && socket.handshake.query.token){
    jwt.verify(socket.handshake.query.token, 'SECRET_KEY', function(err, decoded) {
      if(err) return next(new Error('Authentication error'));
      socket.decoded = decoded;
      next();
    });
  } else {
      next(new Error('Authentication error'));
  }    
})
.on('connection', function(socket) {
    // Connection now authenticated to receive further events

    socket.on('message', function(message) {
        io.emit('message', message);
    });
});

Реализация с socketio-jwt модуль

Этот модуль делает аутентификацию намного легче в обеих сторонах клиента и сервера. Просто проверьте их примеры.

клиент

var token = sessionStorage.token;
var socket = io.connect('http://localhost:3000');
socket.on('connect', function (socket) {
  socket
    .on('authenticated', function () {
      //do other things
    })
    .emit('authenticate', {token: token}); //send the jwt
});

Сервер

var io = require('socket.io')();
var socketioJwt = require('socketio-jwt');

io.sockets
  .on('connection', socketioJwt.authorize({
    secret: 'SECRET_KEY',
    timeout: 15000 // 15 seconds to send the authentication message
  })).on('authenticated', function(socket) {
    //this socket is authenticated, we are good to handle more events from it.
    console.log('hello! ' + socket.decoded_token.name);
  });
143
ответ дан 31 October 2019 в 13:47

можно использовать этот URL.

var socket = SocketIOClient(socketURL: URL(string: "http://00.00.00.00:port")!, config: SocketIOClientConfiguration(arrayLiteral: SocketIOClientOption.connectParams(["token": "your secret key"])))
-15
ответ дан 31 October 2019 в 13:47

Другие вопросы по тегам:

Похожие вопросы: