javascript - 使用 JWT 身份验证重新连接断开的 socket.io

标签 javascript socket.io jwt

我正在使用 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/

相关文章:

javascript - 为什么要使用访问器(getter 和 setter)?

javascript - 在 ember js 中需要外部 js 和 css 库的正确方法?

javascript - 使用node.js + socket.io处理多用户数据

node.js - 在socket.io上,我是否总是必须对每个emit()进行身份验证,而不是仅在建立连接时进行身份验证?

python - Cloud Endpoints 返回 401 Jwt issuer is not configured

javascript - 单击 anchor 标记和外部元素时如何使用 JQuery 交换图像?

javascript - 在我的 html 代码中创建动态 id

javascript - Socket.IO 无法通过 https 连接

javascript - 客户端无法保存jpeg图片

node.js - 如何在 Node/套接字应用程序中验证 laravel passport api token ?