问题描述
据我对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生成。用户将username
和password
发送到login
端点,然后您的服务器返回JWT。
现在,这个login
API是什么?
大多数API服务器都实现HTTP端点(POST /login
)。然后客户端可以将其保存在local storage
中。
如果您的应用没有HTTP服务器来支持,则可以通过WebSocket来实现。