使用 redux saga 在 react native 中实现令牌刷新

Posted

技术标签:

【中文标题】使用 redux saga 在 react native 中实现令牌刷新【英文标题】:Implement token refresh in react native with redux saga 【发布时间】:2020-05-26 14:32:01 【问题描述】:

我有一个redux-saga 中间件来促进异步存储操作,并且所有 API 调用都是通过 sagas 进行的。现在实现OAuth2我想检查我的令牌是否已过期,然后在 API 调用发生之前用刷新令牌刷新它。问题是我无法找到拦截传奇的解决方案来做到这一点。我的 expiresAt 值处于存储状态,应用于决定访问令牌是否已过期。

我想要构建什么

在每个 saga 之前运行的拦截器,允许访问 redux 状态并触发 redux 操作。这样我就可以从 store 访问 expiresAt 以将其与当前日期时间进行比较,然后如果令牌过期,则触发 refresh api 以刷新它并随后调度 store 操作,然后真正的 saga 可以使用更新的令牌。

目前发现的方法:

    using effectMiddleWares:这不会暴露 redux 状态,也不会允许在内部执行 saga 效果,因为它不是生成器(worker) Using wild card action:已经尝试过处理这个问题,但这并不能确保指定为触发操作而生成的工人传奇等待这个通配符传奇首先被执行。 使用全局状态来存储 expiresAt 并将令牌刷新的逻辑放在网络层,即过去的 sagas 中:我不相信这一点。

感谢任何帮助。另外,如果我手头的问题没有朝着正确的方向思考,请让我知道正确的方法。可能没有传奇。

【问题讨论】:

【参考方案1】:

我可能会建议使用单独的生成器函数来在后台刷新令牌。该过程将如下所示:

    令牌是由一些传奇累积的,比如login。它将派发LOGIN_SUCCESS 操作以将令牌存储在 Redux 中。 另一个传奇,比如refreshToken 将监听LOGIN_SUCCESS 动作并启动计时器。当计时器到期时,它将刷新令牌或调度将执行令牌刷新的 saga 操作。 成功刷新令牌后,LOGIN_SUCCESS 将被发送,这将带我们进入第 2 步。

因此,令牌将始终刷新,用户在执行操作时不会遇到延迟。

作为附加检查,您可以实施私有路由以在令牌刷新失败的情况下自动注销用户。

【讨论】:

感谢您的方法,但这将使身份验证成为滑动窗口,因此令牌永远不会过期。我也想要一些不活跃的东西。因此,如果用户在特定的持续时间内没有接触应用程序并且令牌过期,那么它不应该被您提议的计时器自动刷新。但是,是的,感谢您的输入。我对此有一些想法。将实施并提出答案。

以上是关于使用 redux saga 在 react native 中实现令牌刷新的主要内容,如果未能解决你的问题,请参考以下文章

在 react redux saga 中处理同步

在 React 中使用 Redux-Saga/Fetch-mock 测试重定向路由

使用 redux saga 在 react native 中实现令牌刷新

React redux saga - 出现一些奇怪的行为

访问 saga 中的 store.dispatch 以与 react router redux 一起使用

使用 React/Redux saga 将数据从组件传递到 action 和 saga