【发布时间】:2020-01-24 08:04:18
【问题描述】:
目标
我想用访问令牌填充我的 Authorization 标头。我想将该访问令牌存储在 Apollo 缓存中,因为 Auth0 明确声明不要将访问令牌存储在本地存储中(我不知道为什么 Apollo Client docs 似乎认为没关系)。
如果做不到这一点,我想安全地存储我的访问令牌,并能够将其添加到每个 Apollo 客户端对 Apollo 服务器的请求中。
const apolloClient = withApollo(({ctx, headers, initialState}) => {
const cache = new InMemoryCache();
// Code here to access local cache.
return new ApolloClient({
cache,
link: new HttpLink({
uri: <apollo server endpoint>,
headers: {
Authorization: `Bearer ${accessToken}`,
'Access-Control-Allow-Origin': 'http://localhost:3000/',
...headers
},
credentials: 'include'
}),
typeDefs,
resolvers
})
})
class MyApp extends App {
render() {
const { Component, pageProps, apollo } = this.props;
return (
<ApolloProvider client={apollo}>
<Component {...pageProps} />
</ApolloProvider>
);
}
}
export default apolloClient(MyApp);
尝试过
- 我尝试从
withApollo函数中访问localStorage,但它是SSR,所以我无法访问它。我打算使用localStorage设置一个布尔值来检查withApollo函数,以便在重定向后知道访问令牌已添加到阿波罗缓存中。 - 我尝试使用缓存和存储布尔值的密钥来检查用户是否已登录,该登录设置在与访问令牌相同的函数中。如果这是真的,我将访问访问令牌密钥并将其添加到
Authorization标头。但是我在设置初始状态以覆盖登录功能中设置的缓存时遇到问题。
其他想法
-
我以为我可以在
李>ctx参数中传递访问令牌,但我对 Next.js 不够熟悉,无法确定这是否是有效的方法。 我以为我可以从组件中将 props 传递给
withApollo函数,但这似乎不太可能。
问题
- 存储访问密钥以便在每次请求时将其添加到 Apollo 客户端的最佳方式是什么?
- 我注意到有些人正在使用
fetchpolyfill,这适合这种情况吗?如果是这样,那将如何运作? -
withApolloHOC 是如何工作的,为什么它需要与 Next.js 一起工作?我已经阅读了这背后的一些代码,但我根本不明白为什么需要它。
【问题讨论】:
-
如何获得令牌?前任。登录后?
-
用户登录并被重定向。他们被重定向到的 URL 包含带有访问令牌的查询字符串。我从那里获取访问令牌并使用
client.writeData()将其添加到本地缓存中。我尝试使用client.writeQuery(),但出现错误。
标签: authorization apollo next.js react-apollo server-side-rendering