创建后更新Apollo客户端身份验证链接

时间:2019-03-21 19:22:51

标签: javascript apollo-client

我正在使用令牌通过Apollo客户端验证对我的服务器的请求,并复制了文档中提供的以下示例:

const httpLink = createHttpLink({ uri: 'http://0.0.0.0:3003' });

const authLink = setContext((_, { headers }) => {
  // get the authentication token from local storage if it exists
  const token = localStorage.getItem('token');
  // return the headers to the context so httpLink can read them
  return {
    headers: {
      ...headers,
      authorization: token ? `Bearer ${token}` : '',
    },
  };
});

const apolloClient = new ApolloClient({
  link: authLink.concat(httpLink),
});

这很好用,但是最终令牌将过期,我需要更新Apollo Client使用的令牌。

在不实例化新的Apollo客户端的情况下该怎么做?

1 个答案:

答案 0 :(得分:1)

我找到了多种方法来使用Apollo Links解决此问题。

我使用的方法(由于应用程序身份验证的结构方式)是使用setContext method from apollo-link-context

例如

import { setContext } from "apollo-link-context";
import { from } from 'apollo-link';

const authMiddleware = setContext((operation, { headers }) => {
  return getToken().then(data => {
    return {
      headers: {
        ...headers,
        authorization: `Bearer ${data.token}` || null,
      }
    };
  });
});

const apolloClient = new ApolloClient({
  link: from([authMiddleware, httpLink]),
  cache,
});

现在,每次发出请求时,标头上都会设置一个令牌。编写getToken函数时要小心,以免在每次向Apollo发出请求时都不会调用新令牌。

还有一个specific Link for refreshing tokens