web-dev-qa-db-fra.com

Authentification des connexions socket io

Comment puis-je authentifier une connexion socket.io? Mon application utilise un noeud final de connexion d'un autre serveur (python) pour obtenir un jeton. Comment puis-je utiliser ce jeton lorsqu'un utilisateur ouvre une connexion de socket côté nœud?

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

Et le côté client:

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

Si le jeton est créé en python:

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

Comment utiliser ce jeton pour authentifier une connexion de socket dans le nœud?

55
el_pup_le

Peu importe que le jeton ait été créé sur un autre serveur. Vous pouvez toujours le vérifier si vous avez la bonne clé secrète et l'algorithme.

Mise en oeuvre avec le module jsonwebtoken

client

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

Serveur

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

Mise en oeuvre avec socketio-jwt module

Ce module facilite beaucoup l’authentification tant côté client que côté serveur. Il suffit de regarder leurs exemples.

client

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

Serveur

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