Flutter网络请求自动刷新Token插件dio_refresh_token的使用
Flutter网络请求自动刷新Token插件dio_refresh_token的使用
dio_refresh_token
是一个用于管理并刷新Dio网络请求中的Token的Flutter插件。它支持安全地管理访问和刷新令牌,自动添加授权头到请求中,并提供了可定制的刷新策略。
特性
- 安全地管理访问令牌和刷新令牌。
- 自动为请求添加授权头。
- 可自定义的令牌刷新策略。
- 与Dio拦截器轻松集成。
安装
在你的 pubspec.yaml
文件中添加 dio_refresh_token
:
dependencies:
dio_refresh_token: ^0.0.1
然后运行以下命令来安装包:
flutter pub get
使用方法
添加拦截器
要使用 TokenInterceptor
,你需要将其添加到你的Dio实例中。以下是具体步骤:
-
导入必要的包:
import 'package:dio/dio.dart'; import 'package:dio_refresh_token/dio_refresh_token.dart';
-
创建并配置你的Dio实例:
final dio = Dio();
-
创建
TokenManager
实例:final tokenManager = TokenManagerImpl();
-
定义你的令牌刷新逻辑,通过创建
TokenRefreshStrategyImpl
实例:final tokenRefreshStrategy = TokenRefreshStrategyImpl( refreshHandler: (dio, refreshToken) async { // 实现你的刷新令牌逻辑 return Response( requestOptions: RequestOptions(path: '/refresh'), statusCode: 200, data: {'access_token': 'newAccessToken', 'refresh_token': 'newRefreshToken'}, ); }, accessTokenExtractor: (response) => response.data['access_token'], refreshTokenExtractor: (response) => response.data['refresh_token'], );
-
将
TokenInterceptor
添加到你的Dio实例:dio.interceptors.add(TokenInterceptor( tokenManager: tokenManager, tokenRefreshStrategy: tokenRefreshStrategy, ));
-
现在你可以像平常一样使用Dio了:
final response = await dio.get('https://api.example.com/data'); print(response.data);
使用TokenManager
TokenManager
类提供了管理令牌的方法。这里是使用它的示例:
import 'package:dio_refresh_token/dio_refresh_token.dart';
void main() async {
final tokenManager = TokenManagerImpl();
// 保存令牌
await tokenManager.saveAccessToken('your_access_token');
await tokenManager.saveRefreshToken('your_refresh_token');
// 获取令牌
final accessToken = await tokenManager.getAccessToken();
final refreshToken = await tokenManager.getRefreshToken();
// 清除令牌
await tokenManager.clearAccessToken();
await tokenManager.clearRefreshToken();
}
示例Demo
下面是一个完整的示例代码,展示了如何使用 dio_refresh_token
插件:
import 'package:dio/dio.dart';
import 'package:dio_refresh_token/dio_refresh_token.dart';
void main() async {
// 创建并配置Dio实例
final dio = Dio();
// 创建TokenManager实例
final tokenManager = TokenManagerImpl();
// 定义TokenRefreshStrategy实现
final tokenRefreshStrategy = TokenRefreshStrategyImpl(
refreshHandler: (dio, refreshToken) async {
// 模拟网络请求以刷新令牌
return Response(
requestOptions: RequestOptions(path: '/refresh'),
statusCode: 200,
data: {'access_token': 'newAccessToken', 'refresh_token': 'newRefreshToken'},
);
},
accessTokenExtractor: (response) => response.data['access_token'],
refreshTokenExtractor: (response) => response.data['refresh_token'],
);
// 将TokenInterceptor添加到Dio实例
dio.interceptors.add(TokenInterceptor(
tokenManager: tokenManager,
tokenRefreshStrategy: tokenRefreshStrategy,
));
// 保存初始令牌(演示用途)
await tokenManager.saveAccessToken('initial_access_token');
await tokenManager.saveRefreshToken('initial_refresh_token');
// 执行网络请求
try {
final response = await dio.get('https://api.example.com/data');
print('Response data: ${response.data}');
} catch (e) {
print('Request failed: $e');
}
// 访问和刷新令牌
final accessToken = await tokenManager.getAccessToken();
final refreshToken = await tokenManager.getRefreshToken();
print('Access Token: $accessToken');
print('Refresh Token: $refreshToken');
// 清除令牌
await tokenManager.clearTokens();
}
这个示例展示了如何设置 dio_refresh_token
插件,并执行一次网络请求。如果访问令牌过期,插件会自动使用刷新令牌获取新的访问令牌。
更多关于Flutter网络请求自动刷新Token插件dio_refresh_token的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter网络请求自动刷新Token插件dio_refresh_token的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用dio_refresh_token
插件进行网络请求并自动刷新Token的示例代码。这个插件结合了dio
库,使得处理过期Token变得更加容易。
步骤1: 添加依赖
首先,在你的pubspec.yaml
文件中添加dio
和dio_refresh_token
的依赖:
dependencies:
flutter:
sdk: flutter
dio: ^4.0.0
dio_refresh_token: ^2.0.0 # 请检查最新版本号
然后运行flutter pub get
来安装依赖。
步骤2: 配置dio和dio_refresh_token
接下来,在你的项目中创建一个dio实例并配置dio_refresh_token
。以下是一个完整的示例:
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:dio_refresh_token/dio_refresh_token.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
late Dio _dio;
@override
void initState() {
super.initState();
setUpDio();
}
void setUpDio() {
BaseOptions options = BaseOptions(
baseUrl: 'https://your-api-base-url.com/api/', // 替换为你的API基础URL
);
// 创建dio实例
var dio = Dio(options);
// 配置拦截器以处理刷新Token
dio.interceptors.add(RefreshTokenInterceptor(
tokenGetter: () async {
// 从本地存储或其他地方获取当前Token
// 这里只是一个示例,实际中你应该从SharedPreferences、SecureStorage等获取
return 'current_access_token';
},
onRefresh: () async {
// 当Token过期时,这里请求新的Token
// 示例:发送一个POST请求到你的服务器以获取新的Token
var response = await dio.post('auth/refresh-token', data: {
'refresh_token': 'your_refresh_token', // 替换为你的刷新Token
});
// 从响应中提取新的access_token
var newToken = response.data['access_token'];
// 返回新的Token
return newToken;
},
when: (response) {
// 判断何时需要刷新Token
// 通常是通过检查HTTP状态码,例如401 Unauthorized
return response.statusCode == 401;
},
));
// 保存dio实例以便后续使用
_dio = dio;
}
void fetchData() async {
try {
var response = await _dio.get('your-endpoint');
print(response.data);
} catch (e) {
print('Error fetching data: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('dio_refresh_token Example'),
),
body: Center(
child: ElevatedButton(
onPressed: fetchData,
child: Text('Fetch Data'),
),
),
);
}
}
解释
- 依赖项:在
pubspec.yaml
中添加了dio
和dio_refresh_token
依赖。 - dio配置:在
setUpDio
方法中,我们配置了dio实例,并添加了RefreshTokenInterceptor
。 - tokenGetter:一个异步函数,用于获取当前的access token。
- onRefresh:当Token过期时,这个函数会被调用以获取新的Token。这里我们通过发送一个POST请求到服务器来获取新的Token。
- when:一个条件函数,用于判断何时需要刷新Token。在这个例子中,我们检查HTTP状态码是否为401。
- fetchData:一个示例函数,用于发送GET请求到API端点并打印响应数据。
注意事项
- 确保你的服务器支持Token刷新机制,并且你有一个有效的刷新Token。
- 在实际应用中,你应该安全地存储和检索Token,例如使用
flutter_secure_storage
或其他安全存储方案。 - 错误处理和日志记录对于生产环境的应用来说非常重要,这里为了简洁起见省略了部分细节。
这个示例展示了如何使用dio_refresh_token
插件来自动处理过期Token的情况,使得网络请求变得更加健壮和易于维护。