我正在使用 JWT 通过 socket.io 进行身份验证。这是客户端代码:
const socket = io.connect(
'ws://123.456.789.0:8500',
{
query: {
token: jwtToken
},
transports: ['websocket', 'polling']
}
);
现在,在某个时刻,jwtToken
会过期,并且与服务器的连接会断开:
...
io.on('connection', async (socket) => {
const isExpired = await checkExpireDateEveryMinute(socket.exp, 5);
if (isExpired) {
socket.disconnect();
}
await socket.on('query', async (data) => {
...
});
});
使用新生成的 JWT token 从客户端重新连接的正确方法是什么?找不到太多这方面的资源。谢谢。
最佳答案
我认为更好的方法是使用 socket.io 的中间件功能,如果您使用 Error 对象调用 next() ,这将阻止 on("connection") 回调触发。它还会将错误消息传输到前端。您可以通过这种方式发送新的 token ,然后重新连接。
这是一个例子:
async function authenticate(socket,next){
const isExpired = await checkExpireDateEveryMinute(socket.exp, 5);
if(isExpired){
const newToken = getNewToken()//Get a new token...
next(new Error(newToken))//This will cause an error in your frontend, and pass the new token.
}else{
next();
}
}
io.use(authenticate)//Register the middleware.
我必须指出一件事:你在 socket.on(query,...) 上执行“await”,这是没有意义的。
至于你的前端,它可能看起来像这样:
function initSocket(token, url) {
const socket = io.connect(url, {//Init the socket.
query: {
token
}
});
return socket;
}
let socket = initSocket('someToken', 'http://localhost:8000')
socket.on('error', async (error) => {
if(error === 'TOKEN_EXPIRED'){
const newToken = await getToken();
socket.close();
socket = initSocket(newToken, 'http://localhost:8000')
}
})
请注意,您需要重新注册套接字的所有事件。
关于javascript - 使用 JWT 身份验证重新连接断开的 socket.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60998118/