在使用 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 生成。用户将username
和password
发送到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 令牌?的主要内容,如果未能解决你的问题,请参考以下文章
在建立连接之前使用后备传输进行 Socket.IO 身份验证