Flutter Android应用上传Firebase Storage时出现“No app check token for request”错误的解决方法求助
我之前在做Flutter Firebase项目的时候也碰到过这个报错,折腾了好一会儿才搞定,其实核心问题就是Firebase App Check的配置没跟上——要么是你开启了App Check但没在应用里配置令牌生成,要么是调试模式下没添加调试令牌。下面给你一步步拆解解决方法:
1. 先确认Firebase App Check的状态
首先打开Firebase控制台,找到你的项目进入App Check页面:
- 如果这里已经开启了App Check功能,那你的应用必须在请求Firebase服务时带上有效的App Check令牌,否则就会触发这个错误。
- 如果是误开启的,你可以暂时关闭App Check来测试(但上线建议开启,提升安全性)。
2. 添加Flutter App Check依赖
在项目的pubspec.yaml文件里,添加App Check的依赖包:
dependencies: firebase_core: ^latest_version # 替换为当前最新版本 firebase_app_check: ^latest_version # 替换为当前最新版本
添加完后运行flutter pub get拉取依赖。
3. 配置Android端的App Check验证方式
Firebase App Check对Android支持Play Integrity(推荐,SafetyNet已逐步被替代)和SafetyNet两种验证方式,选一种配置:
步骤A:在Firebase控制台配置验证提供者
- 进入App Check页面,选择你的Android应用,点击Add provider。
- 选择Play Integrity(或SafetyNet),按照提示输入你的应用SHA-256指纹:
- 调试指纹可以用命令获取:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android - 发布指纹则用你打包用的正式keystore生成。
- 调试指纹可以用命令获取:
- 保存配置,Firebase会自动完成后续的关联。
步骤B:在Flutter代码中初始化App Check
在main.dart的main函数里,初始化Firebase之后添加App Check的激活代码:
import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_app_check/firebase_app_check.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // 先初始化Firebase核心 await Firebase.initializeApp(); // 激活App Check,指定Android的验证提供者 await FirebaseAppCheck.instance.activate( androidProvider: AndroidProvider.playIntegrity, // 选你刚才配置的PlayIntegrity或SafetyNet ); runApp(const MyApp()); }
4. 处理调试模式的令牌(关键!)
如果你用调试keystore运行应用,Firebase会生成一个调试令牌,但默认不会被允许访问。你需要把这个令牌添加到Firebase控制台:
- 运行应用,打开Android Studio的Logcat,搜索
Debug token,会找到类似这样的日志:D FirebaseAppCheck: Debug token: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
- 复制这个令牌,回到Firebase控制台的App Check页面,找到你的Android应用,点击Add debug token,粘贴令牌后保存。
5. 检查Firebase Storage的安全规则
如果你的Storage规则里强制要求App Check令牌,那必须确保前面的配置都正确。比如规则是这样的:
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { // 要求请求携带有效的App Check令牌 allow read, write: if request.app != null; } } }
如果暂时想跳过App Check测试,可以临时把规则改成允许所有请求(注意:上线前一定要改回严格规则!):
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if true; // 仅用于本地测试,上线禁用 } } }
6. 最后清理缓存重启
有时候缓存会导致配置不生效,建议做以下操作:
- 在真机/模拟器上清除应用的缓存和数据
- 运行
flutter clean清理项目缓存 - 重新运行
flutter pub get - 重启应用
如果做完这些还是有问题,可以查看Logcat里的详细错误日志,看看是不是令牌获取失败(比如网络问题、指纹不匹配等),针对性排查就行。
内容的提问来源于stack exchange,提问作者ryan chandra

