it-swarm.com.de

Authentifizieren von Socket-Io-Verbindungen

Wie kann ich eine socket.io-Verbindung authentifizieren? Meine Anwendung verwendet einen Anmeldeendpunkt von einem anderen Server (Python), um ein Token abzurufen. Wie kann ich dieses Token verwenden, wenn ein Benutzer eine Socket-Verbindung auf der Knotenseite öffnet?

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

Und die Kundenseite:

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

Wenn das Token in Python erstellt wird:

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

Wie kann ich dieses Token verwenden, um eine Socket-Verbindung im Knoten zu authentifizieren?

55
el_pup_le

Es spielt keine Rolle, ob das Token auf einem anderen Server erstellt wurde. Sie können immer noch überprüfen, ob Sie den richtigen geheimen Schlüssel und Algorithmus haben.

Implementierung mit jsonwebtoken Modul

Client

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

Server

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

Implementierung mit socketio-jwt Modul

Dieses Modul erleichtert die Authentifizierung sowohl auf Client- als auch auf Serverseite erheblich. Schauen Sie sich einfach ihre Beispiele an.

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

Server

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