重新连接断开的socket.io与JWT身份验证

时间:2020-04-02 18:03:21

标签: 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令牌从客户端重新连接的正确方法?在此上找不到太多资源。谢谢。

1 个答案:

答案 0 :(得分:1)

我认为一种更糟糕的方法是使用socket.io的中间件功能,如果您使用Error对象调用next(),则它将阻止触发on(“ connection”)回调。它还会将错误消息传输到前端。您可以通过这种方式发送新令牌,然后重新连接。

这里是一个例子:

my_name= ("Kevin")
my_age= int("21")
diameter=float(2.9)
pi= 3.14
area= float(pi*(2.9/2)**2)
print(area)
print=("My name is " + my_name + ". I am " +  str (my_age) + " years old. And the area of the   circle is " + (area))

我必须指出一些事情:您正在对socket.on(query,...)进行“等待”,这没有任何意义。

对于您的前端,它可能看起来像这样:

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.

请注意,您将需要重新注册套接字所具有的所有事件。

相关问题