【发布时间】:2017-11-23 08:35:09
【问题描述】:
我正在使用基于令牌的身份验证,想知道如何在 Relay Modern 中将其完全绑定在一起。我已经完成了一半。任何帮助深表感谢。这是我的设置:
- 在
<App />内部的顶层,我渲染了<QueryRenderer />入口点。 - 在
<LoginPage />组件中,我有一个表单,它在提交时触发LoginUserMutation。当我提供有效的用户名和密码组合时,我会收到一个令牌:- 我通过
localStorage.setItem('token', token)将该令牌保存在localStorage中 - 然后我想通过
history.push('/dashboard')将用户重定向到/dashboard路由
- 我通过
- 在
createRelayEnvironment.js的 fetchQuery 中,我定义了如何向 GraphQL 后端发出网络请求:- 在这里我读到我是否有一个存储在 localStorage 中的令牌,即
const token = localStorage.getItem('token'); - 如果令牌可用,我设置以下标头:
{ ..., 'authorization': 'Bearer ${token}' }。然后后端就可以对用户进行身份验证。
- 在这里我读到我是否有一个存储在 localStorage 中的令牌,即
到目前为止太好了。不幸的是,有一个问题破坏了画面。当令牌已存储到 localStorage 后应用程序初始化时,此设置非常有效。但是,如果您当前在 localStorage 中没有令牌条目而未经身份验证,则不是这样。
如前所述,假设您在 LoginUserMutation 中,变异已成功,并且您在 onComplete 回调中获得了一个有效的令牌。现在该怎么办?是的,我将它存储在localStorage 中。但是,如果我将用户重定向到 <Dashboard /> 组件,我就完蛋了。为什么? - 仪表板组件需要受限数据。当应用程序第一次初始化时,虽然没有提供受限数据,因为没有令牌被发送到 GraphQL 端点。然后,当令牌最终在 LoginUserMutation 中可用时,中继实际上并没有对它做任何事情。
tl;dr
第一季度
在我将用户发送到/dashboard 之前,我如何——配备一个有效的令牌——触发<Dashboard /> 组件所需的数据的重新获取。
第二季度
使用 JSON Web 令牌 (JWT) 时,是否有更好的方法来处理带有中继的身份验证?特别是,从您在 LoginUserMutation 的 onComplete 回调中收到有效令牌时该怎么做?
【问题讨论】:
-
您找到解决方案了吗?使用 Relay Classic 曾经有中间件。在 Apollo 中有类似的中间件:networkInterface.use([{ applyMiddleware(req, next) {} }]); networkInterface.useAfter([{ applyAfterware({ response: { headers } }, next) {} }]); Relay Modern 中没有任何内容。
标签: reactjs authentication graphql relayjs