You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用中如何保护AAD访问令牌与获取令牌的凭证?

保护Flutter应用中的Bearer Token与OAuth凭证

一、修复令牌获取流程(根源解决凭证泄露)

你当前直接调用微软token接口并通过表单传凭证的方式本身就存在极大风险,因为客户端无法安全存储或传输敏感凭证,建议做以下调整:

  • 替换为OAuth2授权码流(Authorization Code Flow):让用户跳转到微软官方登录页面输入凭证,客户端仅获取授权码,再由你的后端服务拿着授权码+客户端密钥去微软换令牌。全程客户端不会接触用户凭证或客户端密钥,彻底避免抓包工具捕获凭证。
  • 若必须使用客户端凭证(不推荐移动端存密钥),通过后端代理获取令牌:客户端调用你自己的后端接口,由后端去请求微软的token接口,客户端只从后端拿到最终的Access Token/Refresh Token,抓包工具只会看到你后端的请求,看不到微软那边的凭证传输。

二、传输层面阻止令牌被抓包

  • 强制HTTPS+证书钉扎:HTTPS本身会加密整个请求(包括请求头的令牌),但抓包工具可通过安装根证书发起中间人攻击。启用证书钉扎后,应用只会信任你指定的服务器证书,拒绝抓包工具的伪造证书,从根源阻止抓包。
    Flutter中可通过dio库实现证书钉扎,示例代码:
    import 'package:dio/dio.dart';
    
    void setupDioWithPinning() {
      final dio = Dio();
      // 替换为你的服务器证书SHA-256指纹
      final certificateFingerprint = "YOUR_CERTIFICATE_SHA256_FINGERPRINT";
      dio.interceptors.add(InterceptorsWrapper(
        onRequest: (options, handler) async {
          // 验证服务器证书指纹(具体实现可参考dio官方文档)
          return handler.next(options);
        },
      ));
    }
    
  • 禁用HTTP请求:在Flutter项目的网络安全配置中,禁止所有HTTP请求,强制只能用HTTPS,避免意外泄露。

三、令牌的安全存储

拿到令牌后,绝对不能存在SharedPreferences(明文存储,易被root/越狱设备读取),要用系统级安全存储:

  • 使用flutter_secure_storage库,它会调用iOS的Keychain和Android的Keystore加密存储令牌,只有当前应用有权限访问:
    import 'package:flutter_secure_storage/flutter_secure_storage.dart';
    
    final storage = FlutterSecureStorage();
    
    // 存储令牌
    await storage.write(key: 'access_token', value: 'YOUR_BEARER_TOKEN');
    // 获取令牌
    String? token = await storage.read(key: 'access_token');
    
  • Refresh Token也要做同样的安全存储,同时设置合理的过期时间,减少泄露风险。

四、令牌使用的额外防护

  • 缩短Access Token有效期:配置微软Azure AD的Access Token为短时效(比如15分钟),就算令牌被捕获,可用时间窗口也很小,危害有限。配合Refresh Token自动刷新,用户无感知。
  • 禁止日志打印令牌:确保应用日志(包括第三方SDK日志)不会输出完整令牌字符串,避免日志泄露。
  • 调试时令牌脱敏:调试阶段仅打印令牌的前几位和后几位,不输出完整内容。

内容的提问来源于stack exchange,提问作者Hamza888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:15:36