Flutter网络请求自动刷新Token插件dio_refresh_token的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

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实例中。以下是具体步骤:

  1. 导入必要的包:

    import 'package:dio/dio.dart';
    import 'package:dio_refresh_token/dio_refresh_token.dart';
    
  2. 创建并配置你的Dio实例:

    final dio = Dio();
    
  3. 创建 TokenManager 实例:

    final tokenManager = TokenManagerImpl();
    
  4. 定义你的令牌刷新逻辑,通过创建 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'],
    );
    
  5. TokenInterceptor 添加到你的Dio实例:

    dio.interceptors.add(TokenInterceptor(
      tokenManager: tokenManager,
      tokenRefreshStrategy: tokenRefreshStrategy,
    ));
    
  6. 现在你可以像平常一样使用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

1 回复

更多关于Flutter网络请求自动刷新Token插件dio_refresh_token的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用dio_refresh_token插件进行网络请求并自动刷新Token的示例代码。这个插件结合了dio库,使得处理过期Token变得更加容易。

步骤1: 添加依赖

首先,在你的pubspec.yaml文件中添加diodio_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'),
        ),
      ),
    );
  }
}

解释

  1. 依赖项:在pubspec.yaml中添加了diodio_refresh_token依赖。
  2. dio配置:在setUpDio方法中,我们配置了dio实例,并添加了RefreshTokenInterceptor
  3. tokenGetter:一个异步函数,用于获取当前的access token。
  4. onRefresh:当Token过期时,这个函数会被调用以获取新的Token。这里我们通过发送一个POST请求到服务器来获取新的Token。
  5. when:一个条件函数,用于判断何时需要刷新Token。在这个例子中,我们检查HTTP状态码是否为401。
  6. fetchData:一个示例函数,用于发送GET请求到API端点并打印响应数据。

注意事项

  • 确保你的服务器支持Token刷新机制,并且你有一个有效的刷新Token。
  • 在实际应用中,你应该安全地存储和检索Token,例如使用flutter_secure_storage或其他安全存储方案。
  • 错误处理和日志记录对于生产环境的应用来说非常重要,这里为了简洁起见省略了部分细节。

这个示例展示了如何使用dio_refresh_token插件来自动处理过期Token的情况,使得网络请求变得更加健壮和易于维护。

回到顶部