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
相关产品推荐
相关产品推荐

