我有一个Redux应用程序和一个用作OAuth服务器的远程API . 根据典型例程,用户将其凭据交换为令牌,然后由应用程序使用该令牌来获取数据并在服务器上执行某些操作 . 此令牌存储在商店中,也存储在 sessionStorage
中 .
现在,有时访问令牌会过期,但由于已经收到刷新令牌,最好先尝试刷新,并且只有在出错时才签署用户 .
我完全理解签约部分,从技术上讲,只是简单地发送某个动作 . 但是如何简化令牌刷新例程呢?
我尝试过redux-saga,但它非常冗长 . 我确实必须部分复制依赖于远程API的每个操作的代码,以确保每个请求首先检查访问令牌以及它是否尚未过期,否则设法刷新它 .
我试图做的另一件事是一个中间件,它会期望某种类型的操作请求将远程API包装到Promise中 . 这种作品,但我很好奇是否有另一种方法可做 .
有没有人实现过这种(非常通用)的东西?任何想法如何自动化令牌刷新,不要因为增加代码量而生气?也许更高阶的组件?
1 回答
对于需要反复发生的代码以及需要无缝且通用的内容,中间件通常是可行的方法 . 它可以像添加两行代码一样简单,以便在创建存储时包含中间件,并编写一个简单的函数来为您处理令牌逻辑 .
假设您将创建您的商店:
然后你可以从初始状态的某个地方调用这个函数 .
这将使您能够对通过商店的所有操作执行某些操作 . 由于使用promises处理API调用的中间件很常见,因此有些人更喜欢为此目的重新使用它,并将两者捆绑在一起 .
典型的中间件看起来像这样:
您的刷新令牌thunk可能与此类似:
您可能会选择的另一种方法是在更改路线时处理此问题 .
让's say you would have a top level route somewhere for the routes that need authentication and a valid user to be present in the system. Let'称他们为
authenticated routes
.您可以使用顶级路由包装这些
authenticated routes
,它定义了onChange
处理函数 . 像这样的东西:创建这些路径并设置商店时,一旦创建了商店,就可以将其绑定到名为
checkAuth
的此函数 .另一种方法是将路径定义包装在一个函数中并将商店传递给它,然后你就可以访问它,但我发现它不像这样(个人偏好) .
那现在_175506会做什么?
像这样的东西:
这些都应该足够通用,以便它们在集中位置为您提供可重用的代码 . 希望你会发现这些有用 .