在 Relay Modern 中处理身份验证

Posted

技术标签:

【中文标题】在 Relay Modern 中处理身份验证【英文标题】:Handling authentication in Relay Modern 【发布时间】:2017-11-23 08:35:09 【问题描述】:

我正在使用基于令牌的身份验证,想知道如何在 Relay Modern 中将其完全绑定在一起。我已经完成了一半。任何帮助深表感谢。这是我的设置:

<App /> 内部的顶层,我渲染了 <QueryRenderer /> 入口点。 在<LoginPage /> 组件中,我有一个表单,它在提交时触发LoginUserMutation。当我提供有效的用户名和密码组合时,我会收到一个令牌: 我通过localStorage.setItem('token', token)将该令牌保存在localStorage中 然后我想通过history.push('/dashboard') 将用户重定向到/dashboard 路由 在 createRelayEnvironment.jsfetchQuery 中,我定义了如何向 GraphQL 后端发出网络请求: 在这里我读到我是否有一个存储在 localStorage 中的令牌,即const token = localStorage.getItem('token'); 如果令牌可用,我设置以下标头: ..., 'authorization': 'Bearer $token' 。然后后端就可以对用户进行身份验证。

到目前为止太好了。不幸的是,有一个问题破坏了画面。当令牌已存储到 localStorage 后应用程序初始化时,此设置非常有效。但是,如果您当前在 localStorage 中没有令牌条目而未经身份验证,则不是这样。

如前所述,假设您在 LoginUserMutation 中,变异已成功,并且您在 onComplete 回调中获得了一个有效的令牌。现在该怎么办?是的,我将它存储在localStorage 中。但是,如果我将用户重定向到 <Dashboard /> 组件,我就完蛋了。为什么? - 仪表板组件需要受限数据。当应用程序第一次初始化时,虽然没有提供受限数据,因为没有令牌被发送到 GraphQL 端点。然后,当令牌最终在 LoginUserMutation 中可用时,中继实际上并没有对它做任何事情。

tl;dr

第一季度 在我将用户发送到/dashboard 之前,我如何——配备一个有效的令牌——触发<Dashboard /> 组件所需的数据的重新获取。

第二季度 使用 JSON Web 令牌 (JWT) 时,是否有更好的方法来处理带有中继的身份验证?特别是,从您在 LoginUserMutationonComplete 回调中收到有效令牌时该怎么做?

【问题讨论】:

您找到解决方案了吗?使用 Relay Classic 曾经有中间件。在 Apollo 中有类似的中间件:networkInterface.use([ applyMiddleware(req, next) ]); networkInterface.useAfter([ applyAfterware( response: headers , next) ]); Relay Modern 中没有任何内容。 【参考方案1】:

验证您的用户时,重新创建中继环境。 您将删除任何现有的缓存。这是推荐的,因为无论如何您的缓存应该根据登录的用户而有所不同,因此完全删除它是可以的。

伪代码:

class App extends PureComponent 
  state = 
    environment: createRelayEnvironment(),
  ;

  login = () => 
    doLoginMutation(
      onSuccess: () => this.setState( environment: createRelayEnvironment() ),
    )
  

  ...

【讨论】:

如果存在与用户要求无关的数据,这似乎不是最佳选择?通用仪表板、首页等【参考方案2】:

经过一番修修补补,找到了一些可行的解决方案。我需要更改我的代码以包含以下内容。看看这个:https://github.com/apollographql/apollo-fetch

可以通过Fetch解决中间件问题。

更新:我试图让它工作但没有成功。

【讨论】:

1.问题是关于现代接力而不是阿波罗。 2. 该链接只是指向一个 repo 主页,而不是任何可能有洞察力的代码。 3.是的不成功? 你需要检查这个包是关于什么的。我说的是带有 Fetch1 的中间件)它可以与 RM 一起使用。它是一个中间件。您从哪里得到不能与 RM 一起使用的想法? 2) repo 包含设置中间件所需的代码。您需要任何具体的指导吗? 3)是的,我很久以前就更新了。

以上是关于在 Relay Modern 中处理身份验证的主要内容,如果未能解决你的问题,请参考以下文章

在网络环境中收到 401 错误时 React Relay Modern 重定向到另一个页面

Relay 和 GraphQL 中的身份验证

使用 Passport 的 Express 服务器、ReactJS 和 Relay 应用程序的身份验证策略

在 Chrome 上弹出处理 windows 身份验证

使用 Django GraphQL JWT 和 Graphene Relay 进行身份验证和授权

我用的是window server 2003系统, 管理工具 计算机管理中:无本地用户和组,如何调出?另用window 身份验...