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

启用AppCheck的Firebase云函数返回401未授权问题排查

Flutter Web Firebase云函数AppCheck 401未授权问题排查与解决

问题背景

部署集成createCompany云函数的Flutter Web应用后,模拟器运行正常,但线上环境调用该函数返回401 - Unauthorized。移除云函数的enforceAppCheck: true配置后恢复正常,说明问题出在AppCheck验证环节。已在Firebase控制台填写reCAPTCHA密钥,且配置了云控制台调用者权限。

相关配置代码

1. Flutter初始化代码(main函数)

await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform,
);
AndroidProvider provider = AndroidProvider.playIntegrity;
if (kDebugMode) {
  provider = AndroidProvider.debug;
}
await FirebaseAppCheck.instance.activate(
  webRecaptchaSiteKey: '<My actual site key here>',
  androidProvider: provider,
);

2. Flutter云函数调用代码

Future<String> createCompany(String firstName, String lastName) async {
    var result = await FirebaseFunctions.instance
        .httpsCallable('createCompany')
        .call(<String, dynamic>{'firstName': firstName, 'lastName': lastName});
    return result.data["company"];
}

3. Firebase云函数代码

exports.createCompany = functions.runWith({
      enforceAppCheck: true
    })
      .https.onCall(async (data, context) => {
        
        functions.logger.log("createCompany start");
        
        if (context.app == undefined) {
          throw new functions.https.HttpsError(
            'failed-precondition',
            'The function must be called from an App Check verified app.')
        }
// ... 业务逻辑代码

需补充的配置与排查步骤

  • 确认reCAPTCHA版本与域名绑定:
    必须使用reCAPTCHA v3密钥,v2无法适配Firebase AppCheck。同时在Google reCAPTCHA控制台中,将生产环境的HTTPS域名(含子域名)添加到允许列表,确保域名完全匹配。
  • 验证Web端AppCheck令牌传递:
    打开Chrome开发者工具「网络」面板,查看createCompany请求的请求头,确认存在X-Firebase-AppCheck字段且携带有效令牌。如果没有,检查FirebaseAppCheck.instance.activate()是否在函数调用前执行完成。
  • 核对云函数调用者权限:
    在Firebase控制台「App Check」→「调用者」页面,确认你的Web应用已被添加为createCompany函数的授权调用者,且状态为「已启用」。
  • 确保云函数区域匹配:
    Flutter中初始化的Firebase Functions区域要和云函数部署的区域一致。若部署时指定了区域(如us-central1),Flutter端需通过配置对齐区域。
  • 检查生产环境AppCheck模式:
    确认生产环境未误开启kDebugMode,确保Web端使用reCAPTCHA而非debug提供者。
  • 查看云函数详细日志:
    在Firebase控制台云函数日志中,查看context.app的具体值。若为undefined,说明令牌验证失败,需排查令牌生成(reCAPTCHA密钥有效性)或传递环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:03:35