在使用 Node/React 验证 socket.io 连接时,您在哪里以及如何生成 JWT 令牌?

Posted

技术标签:

【中文标题】在使用 Node/React 验证 socket.io 连接时,您在哪里以及如何生成 JWT 令牌?【英文标题】:Where and how do you generate a JWT token when authenticating a socket.io connection with Node/React? 【发布时间】:2020-12-01 23:49:56 【问题描述】:

据我对 Socket.io 的了解,存在多个安全问题,例如 this stack exchange post. 中提到的那些

就我而言,我在 Node 中使用 socket.io,在 React 中使用 socket.io-client,并设置了一条很好的通信线路,但是我不需要从客户端登录,因为我' m 只需从后端查询外部 API 并将结果发布到前端。所以我决定使用包 socketio-jwt 来使用 jwt 令牌保护连接。

为了实现,documentation 包含以下使用 jwt 身份验证的示例:

服务器端

io.use(socketioJwt.authorize(
  secret: 'your secret or public key',
  handshake: true
));
 
io.on('connection', (socket) => 
  console.log('hello!', socket.decoded_token.name);
);

客户端

const socket = io.connect('http://localhost:9000', 
  extraHeaders:  Authorization: `Bearer $your_jwt` 
);

我的问题是:在客户端变量在哪里your_jwt从哪里来,如何生成它?

【问题讨论】:

【参考方案1】:

您的 Node 应用程序中应该有一个生成 JWT 的端点,客户端将从该端点获取它,将其保存在持久存储中并重复使用。

【讨论】:

【参考方案2】:

令牌需要由login API 生成。用户将usernamepassword 发送到login 端点,然后您的服务器返回JWT。

现在,login API 是什么?

大多数 API 服务器都实现了 HTTP 端点 (POST /login)。然后客户端可以保存到local storage

如果您的应用没有支持 HTTP 服务器,您可以通过 WebSocket 实现。

【讨论】:

我的帖子表明我特别不使用登录流程 @J.E.C.您能否详细说明这个问题,因为如果您不需要登录流程,那么为什么首先需要身份验证(JWT)? 我一直认为 socket.io 必须手动保护,无论您使用它做什么 - 或者我错了?我认为攻击者可能会劫持 socket.io 连接并进行 DoS 攻击,或者其他我不知道的事情。 我想你可能会混淆wss(WebSocket Secure)和jwt(JSON Web Tokens)。 wss 用于保护客户端和服务器之间的通信(网络)(这应该停止大多数 Man-in-the-middle attack)。 jwt 用于管理无状态身份验证(用户身份)。

以上是关于在使用 Node/React 验证 socket.io 连接时,您在哪里以及如何生成 JWT 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

从React js应用读取Express会话cookie

在建立连接之前使用后备传输进行 Socket.IO 身份验证

Laravel 5:使用 Laravel 会话数据的 Socket.io 客户端身份验证

socket.io 身份验证在第一个连接上不起作用

使用 JWT 进行身份验证时如何区分用户类型

Node (Express) / React 应用程序仅在本地工作