【问题标题】:JWT Authorization Over Socket.io Connection通过 Socket.io 连接的 JWT 授权
【发布时间】:2019-03-10 03:19:16
【问题描述】:

我还没有找到现成的答案,这让我觉得我问错了问题。如有必要,请随时(温和地或以其他方式)将我推向更好的道路。

我们使用专用的身份验证服务器,其目的是 (1) 给定登录凭据,返回具有近期 exp 的 JWT 或 (2) 给定 JWT,根据一组规则,发出一个新的智威汤逊。本质上是一次刷新。

这一切都很好,直到它被黑客入侵。但就目前而言,它是王牌。

然而,当涉及到socket.io 与非身份验证服务器的连接时,我们的想法不止于此。我想知道是否有人会这么好心来评估这个过程。 (我很高兴发布更多代码;你告诉我它是否相关)。

1) 初始socket.io 连接导致挑战:

this.socket.emit('authenticate'); // the challenge

this.authTimeout = setTimeout(() => {
  this.socket.disconnect('unauthorized', errors);
}, TIME_TO_AUTHENTICATE); // the response kills this!

this.socket.on('authenticate', token => {
  clearTimeout(this.authTimeout);
  this._authenticate(token)
})

2) 后续消息必须包含以下形式的“有效负载”消息: payload = {token: 'foo', message: 'bar'},如果有效则接受哪个令牌,如果无效则返回。

另外,资源服务器会定期发送自己的heartbeat,必须得到heartbeat {token}的确认。

我的问题是:这似乎太容易了;我在某处偷工减料吗?你能打败这个脆弱的防御工事吗?

为了清楚起见,我们希望在这里推出我们自己的模块。我很高兴看到现有的任何东西;只是还没有找到任何我可以开始说服老板完全满足我们需求的东西。

非常感谢。

【问题讨论】:

    标签: node.js authentication socket.io jwt


    【解决方案1】:

    我无法完全分析该方法或确保它没有缺陷,但我想指出一些想到的事情:

    • 除了在身份验证质询超时的情况下断开用户连接外,您必须确保服务器在授权质询实际成功完成之前不会向该用户发送任何非公开消息。否则,在超时之前的一段时间内,用户可以在没有经过身份验证的情况下接收消息。

    • 如果令牌无效(或以某种方式阻止发送非公开消息),我假设您也在断开套接字。

    • This article 是关于使用 JWT 验证 socket.io 通信的。它是从 2014 年开始的,所以可能有点过时,但我认为核心概念仍然有效。

    • 与文章相关,有一个专门用于使用 jwt 验证 socket.io 连接的工具。即使您不想使用它,您也可能想探索它的代码以寻找“灵感”。你可以在这里找到它:socketio-jwt

    您可以看到此工具能够使用两种不同的方法:

    1. 与您的方法非常相似:

    来自 socketio-jwt/blob/master/lib/index.js

    if(options.required){
      var auth_timeout = setTimeout(function () {
        socket.disconnect('unauthorized');
      }, options.timeout || 5000);
    }
    
    socket.on('authenticate', function (data) {
      // ...
      // Token validation
    
      // Emit "authenticated" event if token is valid, the server can use
      // this event as a point to send messages, once token is valid
    });
    
    1. 一种“一次往返”方法,基本上在握手期间使用查询字符串。其主要缺点是令牌在 URL 中公开,因此可能会被记录或被公开。

    【讨论】:

    • 感谢您的详细回复,很抱歉花了这么长时间才接受答案。假期等。我会更深入地研究 socketio-jwt 库,就像你说的那样,它看起来与我的相似,尽管更成熟。
    猜你喜欢
    • 2016-11-27
    • 2015-03-23
    • 1970-01-01
    • 2018-06-07
    • 2019-04-18
    • 2023-02-23
    • 2022-06-30
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多