当前位置: 首页 > 面试题库 >

使用JWT验证套接字io连接

仲孙俊贤
2023-03-14
问题内容

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

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


问题答案:

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

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


 类似资料:
  • 问题内容: 调用一次后如何重新连接到套接字io ? 这是代码 如果我这样做,它会起作用。如果我这样做,它将断开连接。但是,如果我尝试使用重新连接,则连接不再起作用。我如何才能建立连接? 问题答案: 好吧,您可以在这里选择… 首次初始化套接字值时,应使用, 下次(调用一次断开连接后),您应使用再次连接。 所以你的应该是这样的

  • 问题内容: 我用NodeJS,socketIO和Express中的不同聊天室制作了一个聊天客户端。我正在尝试显示每个房间的已连接用户的更新列表。 有没有一种方法可以将用户名连接到对象,以便在执行操作时可以看到所有用户名: 然后执行以下操作: 我还可以通过其他方式做到这一点? 解决: 这有点重复,但是解决方案在任何地方都不很清楚地写出来,所以我想我会在这里写下来。这是的解决方案后由安迪轩至极被回答。

  • 我是Heroku的新手,我正在尝试部署使用socket.io侦听的NodeJS应用程序。我能够部署到本地和它的工作罚款。但是当在Heroku中运行相同的内容时,它没有响应。 在Heroku中有没有需要为套接字io指定的特定端口?我不能使用process.env.port,因为我正在将其用于app server端口。 有什么解决这个问题的想法吗?或者我们需要启用一些配置来使用套接字IO吗? 我想我们

  • 我正在使用flutter socket io与运行Node/Express的服务器通信。 服务器代码: 我的扑动代码: 当我尝试连接时,我会得到一个超时错误,该错误在OnConnectRetror中捕获。 节点服务器正在运行debian,我已经检查了防火墙状态: 当我通过chrome打开url时,我得到的是“你好”信息。当我尝试netcat“NC-VZ MyServerIP8080时,我已经成功地

  • 我正在尝试升级我的MVC网站以使用新的OpenID Connect标准。OWIN中间件似乎非常健壮,但不幸的是只支持“form_post”响应类型。这意味着Google不兼容,因为它在“#”之后返回url中的所有令牌,因此它们永远不会到达服务器,也永远不会触发中间件。 我自己尝试过在中间件中触发响应处理程序,但似乎根本不起作用,所以我有一个简单的javascript文件,它解析出返回的声明,并将它

  • 如果有人对WebSocket/Socket IO有经验,希望你能给我指出正确的方向。 我制作了一个不和谐的克隆,我正试图优化它以更好地扩展。现在,当一个用户发送一条消息时,我向数据库查询该服务器的所有用户部分,并向他们的特定套接字发送一条消息。这显然不能很好地扩展,因为每条消息都需要在客户机列表中进行昂贵的查询和查找 然而,为每台服务器使用房间将消除我查询数据库的需要。我知道我可以在套接字服务器首