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

问题描述

据我对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 来自何处,如何生成它?

解决方法

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

,

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

现在,这个login API是什么?

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...