当令牌过期时在graphQL客户端中使用刷新令牌

问题描述 投票:1回答:1

方案是:

  1. Web应用程序已打开,但令牌已过期。
  2. 然后用户执行一些操作以发出api请求。
  3. GraphQL返回Error: GraphQL error: unauthorized
  4. 该应用由于错误而没有响应。糟糕的用户体验。
  5. onError方法中的[apollo-link-error捕获到错误,因此可以调用refreshToken()(它需要到期的jwt)。
  6. 生成新令牌并存储以供使用。
  7. 下一次用户操作将照常进行。

当前是我的代码:

const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors.length > 0) {
    refreshToken();
  }
});

const link = ApolloLink.from([errorLink, terminatingLink]);

我们如何改进此流程,以便在用户发出请求而不会出错时刷新令牌?如果请求导致错误,则将请求“搁置”,然后刷新令牌后将对其进行处理。但是我不确定该怎么做。

或者我们还有其他方法可以对此流程进行改进吗?

error-handling graphql jwt access-token refresh-token
1个回答
0
投票

您可以创建一个链接,该链接可以通过终止链接在执行操作之前运行。您可以使用create your own stateless link,但也可以使用setContext摆脱困境,它可以在我们使用时设置您的请求标头。

因为您正在使用JWT,所以您可以decode it on the client side提取到期值,并使用该值来确定是否需要刷新令牌之前,将请求发送到服务器。如果您不使用JWT,但是服务器返回了带有令牌的到期时间,则将应用相同的策略。

const contextLink = setContext(async () => {
  const { exp } = jwtDecode(jwt)
  // subtracts a minute to account for latency
  const expirationTime = (exp * 1000) - 60000
  if (Date.now() >= expirationTime) {
    await refreshToken()
  }
  return {
    // you can set your headers directly here based on the new token
    headers: {
      ...
    }
  }
})
© www.soinside.com 2019 - 2024. All rights reserved.