Flutter中基于Dio实现Token Refresh

本文介绍了在Flutter中使用Dio框架实现Token自动刷新的完整流程,包括拦截器设置、刷新Token、重发请求以及避免并发问题。通过TokenInterceptor类和同步队列解决了并发请求时的Token刷新问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flutter中基于Dio实现Token Refresh

1. 背景介绍

目前项目在采用Flutter开发一款App,该工程中采用Dio框架作为网络请求框架,用户登录方面采用 OAuth2 协议。众所周知, OAuth2 协议中是用户初次登录时获取 access_token,之后当 access_token 过期后采用 refresh_token 再获取新的 access_token 。现在问题的难点是用户在使用过程中如果出现票据过期了,服务就不能正常返回数据,此时需要自动刷新票据,且刷新过程需要对用户透明。

说到这里,有几种解决思路:

  1. 简单的方式:在用户打开App时计算过期时间,始终保证票据过期前更新票据。

这种方式存在的问题是如果账号在其它终端登录了会使当前终端的票据提前失效(看服务实现,一般来说会限制为一个账号只允许一个终端登录)。

  1. 正规的方式:用户在App端访问服务时服务端对access_token校验,当票据失效后给出对应状态码提示。 App端对返回状态码解析,根据状态码提示执行刷新票据的请求,当获取到新的票据后再将用户当前访问请求重发。

下面介绍的就是第2种方式,直接刷新Token的方式。

2. Token刷新流程

Token刷新流程如下所示:

Alt text

  1. 用户通过App查询服务
  2. App端调用App服务端接口进行查询
  3. App服务端调用OAuth服务端接口校验access_token是否失效
  4. OAuth服务端校验出access_token已经失效,返回错误提示
  5. App服务端将OAuth服务端错误提示返回给App端
  6. App端收到票据过期提示后,调用OAuth服务端接口刷新access_token
  7. OAuth服务端返回新的access_token
  8. App端将新的access_token保存到本地cache
  9. App端携带新的access_token并重发查询服务请求到App服务端
  10. App服务端校验access_token通过后并将服务查询结构返回给App端
  11. App端将服务查询结构展示给用户

从图中可以看出,关键部分在于第6步刷新Token和第9步重发请求,下面逐一介绍这2处的实现。

3. 刷新Token

由于不确定票据失效时是哪个请求触发的,所以可以全局拦截请求,对请求的响应信息进行解析判断。 Dio 中有拦截器,可以达到拦截请求的目的。

1. 添加拦截器 TokenInterceptor

Dio添加拦截器

Dio dio = new Dio(); // with default Options
// Set default configs
dio.options.baseUrl = baseURL ?? ApiPath.baseURL;
dio.options.connectTimeout = 100000; // 100s
dio.options.receiveTimeout = 100000; // 100s

dio.interceptors.clear();

// 添加拦截器TokenInterceptor
dio.interceptors.add(TokenInterceptor(dio));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值