[英]Handling authentication in Relay Modern
我正在使用基于令牌的身份验证,并且想知道如何在Relay Modern中将其完全捆绑在一起。 我中途了。 任何帮助深表感谢。 这是我的设置:
<App />
的顶层,我渲染<QueryRenderer />
入口点。 <LoginPage />
组件内部,我有一个表单在提交时触发LoginUserMutation 。 当我提供有效的用户名和密码组合时,我会收到令牌:
localStorage.setItem('token', token)
将令牌保存在localStorage中 history.push('/dashboard')
将用户重定向到/dashboard
路线 createRelayEnvironment.js
的fetchQuery内部,我定义了如何向GraphQL后端发出网络请求:
const token = localStorage.getItem('token');
{ ..., 'authorization': 'Bearer ${token}' }
。 然后,后端便可以对用户进行身份验证。 到目前为止,太好了。 不幸的是,有一个问题破坏了画面。 当令牌已存储到localStorage后,应用程序初始化时,此设置非常有用。 但是不是这样,如果您当前未通过身份验证,并且在localStorage中没有令牌条目。
如前所述,假设您位于LoginUserMutation内部,该突变已成功完成,并且您在onComplete
回调中获得了有效令牌。 现在该怎么办? 是的,我将其存储在localStorage
。 但是,如果我将用户重定向到<Dashboard />
组件,则会很麻烦。 为什么? -仪表板组件需要受限的数据。 当应用程序首次初始化时,尽管未提供受限数据,因为没有令牌发送到GraphQL端点。 然后,当令牌最终在LoginUserMutation中继中可用时,中继实际上不会对其执行任何操作。
tl; dr
Q1我如何为用户配备有效的令牌-在将用户发送到/dashboard
之前,触发<Dashboard />
组件所需的数据的重新提取。
Q2使用JSON Web令牌(JWT)时,是否有更好的方法来处理带有中继的身份验证? 特别是,从LoginUserMutation的onComplete
回调内收到有效令牌的那一点起,该怎么办?
对用户进行身份验证时,请重新创建中继环境。 您将删除所有现有的缓存。 推荐这样做是因为无论如何,您的缓存都应根据登录的用户而有所不同,因此可以完全删除它。
伪代码:
class App extends PureComponent {
state = {
environment: createRelayEnvironment(),
};
login = () => {
doLoginMutation({
onSuccess: () => this.setState({ environment: createRelayEnvironment() }),
})
}
...
}
经过一番修补,找到了一些可行的解决方案。 我需要更改代码以合并以下内容。 看看这个: https : //github.com/apollographql/apollo-fetch
它可以通过Fetch解决中间件的问题。
更新:我试图使其正常运行,但未成功。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.