【译】Swift async/await 并发之自动刷新token
· 9 min read
原文:Building a token refresh flow with async/await and Swift Concurrency
Swift 5.5 引入了 async/await,更进一步简化异步代码的语法。
本文作者使用网络请求中自动刷新 token 的功能来说明用法,这是 OAuth 2 里面必备的一个功能了。
工作流
先来复习一下网络请求的流程,我们假设有一个AuthManager
对象来管理 token 操作。创建一个网络请求时,从AuthManager
对象获取一个 token。逻辑如下:
- 如果 token 为空或无效,那就跳转到登录界面;
- 如果能够获取有效 token,那就正常执行请求;
- 如果请求成功,直接返回请求结果;
- 如果请求失败
- 失败原因是 token 无效
- 需要先刷新 token,
- 刷新失败,抛出异常
- 刷新成功,执行请求
- 请求成功,返回请求结果
- 请求失败,抛出异常(即使是 token 无效也不再重试了,不然无穷无尽)
- 需要先刷新 token,
- 失败原因是其他,直接抛出异常
- 失败原因是 token 无效
AuthManager
的逻辑是先检查本地 token 是否存在,如果没有,抛出异常;如果存在,检查 token 有效性;如果 token 无效,尝试刷新 token 请求;刷新成功,返回新 token;刷新失败,抛出异常,弹出登录界面。如下图所示:
接下来,我们来实现一个AuthManager
对象,然后演示一下在Network
对象怎么使用它。