React Apollo链接-除了使用<Query />和<Mutation />组件之外,如何在GraphQL服务器上查询身份验证令牌?

时间:2019-09-17 16:16:07

标签: graphql apollo react-apollo

在阅读了许多有关如何处理Apollo React的重新身份验证的文章之后,我确定我需要编写自己的逻辑来处理检查过期的JWT,刷新令牌并进行操作。我不想从错误重定向到任何类型的登录页面,也不想等到错误发生时刷新我的令牌。

因此,我稍微关注了Apollo文档,将标记添加到每个请求的标头。效果很好:

const authLink = new ApolloLink((operation, forward) => {
  operation.setContext(({ headers = {} }) => {
    const token = localStorage.getItem('token');

    // TODO: Check if token is expired. If so, fetch a new one from GraphQL server and THEN
    // move forward with operation

    // If token exists, add to headers
    if (token) {
      headers = { ...headers,authorization: token ? `Bearer ${token}` : "", };
    }

    return { headers };
  });

  return forward(operation);
});


const httpTopicsServiceLink = createHttpLink({
  uri: 'http://localhost:4000/topics',
});

export const TopicsClient = new ApolloClient({
  link: authLink.concat(httpTopicsServiceLink),
  cache: new InMemoryCache(),
});

但是,在authLink函数内部,我想检查令牌是否过期,以便能够将GraphQL突变发送到服务器以刷新令牌,然后转发我的操作。由于我一直在Apollo <Query /><Mutation />组件中进行所有GraphQL查询和变异,因此我不确定如何向GraphQL服务器发出隔离请求以实现这种功能。我该怎么办?

1 个答案:

答案 0 :(得分:0)

您可以使用TopicsClient将采石场和突变发送到graphql服务器。

const client = new ApolloClient({
  link: new ApolloLink((operation, forward) => {...}),
  cache: new InMemoryCache()
});

客户端应该在ApolloLink结构内部可以访问。

相关问题