Authenticating socket io connections using JWT

前端 未结 2 1789
梦毁少年i
梦毁少年i 2020-11-27 09:16

How can I authenticate a socket.io connection? My application uses a login endpoint from another server (python) to get a token, how can I get use that token whenever a user

相关标签:
2条回答
  • 2020-11-27 10:04

    you can use this url.

    var socket = SocketIOClient(socketURL: URL(string: "http://00.00.00.00:port")!, config: SocketIOClientConfiguration(arrayLiteral: SocketIOClientOption.connectParams(["token": "your secret key"])))
    
    0 讨论(0)
  • 2020-11-27 10:05

    It doesn't matter if the token was created on another server. You can still verify it if you have the right secret key and algorithm.

    Implementation with jsonwebtoken module

    client

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

    Server

    const io = require('socket.io')();
    const 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);
        });
    });
    

    Implementation with socketio-jwt module

    This module makes the authentication much easier in both client and server side. Just check out their examples.

    client

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

    Server

    const io = require('socket.io')();
    const 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}`);
      });
    
    0 讨论(0)
提交回复
热议问题