我正在尝试建立对socketio websocket的身份验证,但是遇到了涉及设置身份验证令牌的问题。问题归结为以下原因:我用来获取最新身份验证令牌的函数是异步的,但似乎为async
的socketio侦听器提供了"reconnect_attempt"
函数事件在尝试重新连接之前不会等待函数返回。
简而言之,这段代码
socket.on("reconnect_attempt", async () => {
const token = await getIdToken();
socket.io.opts.query = { token };
});
在重新连接请求发送到服务器之前,实际上没有设置套接字的query.token
。这样,当令牌过期后发生重新连接时,将在获取新令牌的同时发送过期的令牌。
是否可以通过某种方式配置socketio,以便它在实际触发重新连接请求之前等待侦听器的处理函数返回?如果没有,我想我必须主动刷新令牌并将其存储在应用程序中的某个位置,但是很好奇是否可行。
答案 0 :(得分:0)
看起来“ reconnect_attempt”回调实际上并没有中断正在发出的请求,但是它只允许您在尝试时进行侦听。相反,您可以将socketio连接设置为完全不自动重新连接,然后订阅断开连接事件。然后,正确处理令牌生成并从那里发起新请求。
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=$HTTP_HOST --sessionTimeout=$SESSION_TIMEOUT"
https://socket.io/docs/client-api/#Event-%E2%80%98reconnect-attempt%E2%80%99-1
答案 1 :(得分:0)
我知道两种方法可以实现这一目标。一种是将您的异步功能转变为同步功能。
function wait_for(promise) {
let ret, done;
promise.then(r => {ret = r, done = true});
while (!done) {}
return ret
}
socket.on("reconnect_attempt", wait_for(
(async () => {
const token = await getIdToken();
socket.io.opts.query = { token };
})()
)
);
另一种方法是禁用reconnection
,并手动处理重新连接。
socket.reconnection(False);
socket.on("disconnect", async () => {
const token = await getIdToken();
socket.io.opts.query = { token };
socket.open()
// implement reconnect attempt limit, delay and such.
});