我正在使用令牌通过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客户端的情况下该怎么做?
答案 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发出请求时都不会调用新令牌。