使用JWT验证套接字io连接


105

如何验证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')

如何使用此令牌对节点中的套接字连接进行身份验证?

Answers:


225

令牌是否在另一台服务器上创建都没有关系。如果您拥有正确的密钥和算法,您仍然可以验证它。

jsonwebtoken模块实施

客户

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

服务器

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

socketio-jwt模块实施

此模块使客户端和服务器端的身份验证更加容易。只是看看他们的例子。

客户

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

服务器

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

我面临一个问题,即使没有到套接字的传入连接,当我启动套接字服务器时,它仍然具有旧令牌。那很奇怪吗?
Lamour

什么是与io.connect在客户端API可用的选项
rocketspacer

2
如果用户最初未经授权并且在第一次尝试时没有秘密,您将如何重新连接到服务器?
sznrbrt

9
您好,我需要问,连接或每次发射事件都需要令牌一次?
克鲁纳尔·林巴德'18

2
对于任何得到的人Cannot read property 'on' of undefined; 只需socket从中删除function(socket)
Thomas Orlita

-28

您可以使用此网址。

var socket = SocketIOClient(socketURL: URL(string: "http://00.00.00.00:port")!, config: SocketIOClientConfiguration(arrayLiteral: SocketIOClientOption.connectParams(["token": "your secret key"])))

9
您应该指出自己正在写一种快速的语言。其他人就是不知道。
Sword Jason

6
您需要解释这个答案,否则这对每个人都没有用。此外,如果它是写在迅速语言请注明,在你的答案
弗雷迪丹尼尔

陈述您使用的语言,并解释解决方案,否则将无济于事。
Mu-Majid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.