确认JWT令牌是否正确有效,若无效则重新生成 JWT 令牌。
确认 JWT 令牌是否已过期,若过期则重新生成 JWT 令牌。
若多次尝试后仍有问题,则可通过以下示例代码进行解决:
// 将ApolloClient实例传递给两个不同的WebsocketLink实例
const authLink = setContext(async (_, { headers }) => { let token;
try { token = await getAuthToken(); // 获取 JWT 令牌 } catch (error) { console.error('Error fetching auth token:', error); return headers; }
return {
headers: {
...headers,
authorization: token ? Bearer ${token}
: '',
},
};
});
// Auth Link 中间件
const wsAuthLink = new ApolloLink((operation, forward) => { return new Observable((observer) => { let handle;
Promise.resolve(operation)
.then((oper) => authLink.request(oper, forward))
.then((oper) => {
operation = oper;
handle = forward(oper).subscribe({
next: observer.next.bind(observer),
error: observer.error.bind(observer),
complete: observer.complete.bind(observer),
});
})
.catch(observer.error.bind(observer));
return () => {
if (handle) handle.unsubscribe();
};
}); });
const wsLink = new WebSocketLink({ uri: WS_ENDPOINT, options: { reconnect: true }, });
const apolloClient = new ApolloClient({ link: wsAuthLink.concat(wsLink), cache: new InMemoryCache(), });
// 在 Apollo Client 中设置新的 JWT 令牌并建立新的WebSocket连接
const updateTokenAndConnect = async (token: string) => {
// 在每个请求中添加 Authorization 头
const headers = { authorization: token ? Bearer ${token}
: '' };
apolloClient.link.options.headers = headers;
if (!apolloClient.link.subscriptionClient) { await apolloClient.wsClient.resetStore(); await apolloClient.wsClient.close(); }
// 重新建立 WebSocket 连接 apolloClient.link.subscriptionClient && apolloClient.link.subscriptionClient.connect(); };
// 调用函数以更新JWT令牌并建立新连接 updateTokenAndConnect(newToken);