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

iOS设备及模拟器中Firebase App Check令牌验证失败问题

Firebase App Check(App Attest)令牌验证失败问题

我尝试在Firebase云函数中通过App Check验证后调用ChatGPT API,计划使用App Attest作为验证方式。已按Firebase App Check文档完成所有配置与编码,但始终收到「无效App Check令牌」错误。


物理设备端已执行的操作

  • 配置Entitlement:将App Attest环境设置为「production」
  • 添加App Attest功能权限
  • 添加Apple团队ID后,在Firebase控制台启用App Attest
  • App Delegate配置代码:
class AppDelegate: NSObject, UIApplicationDelegate {
  func application(_ application: UIApplication,
                   didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
    
      let providerFactory = YourAppCheckProviderFactory()
//      let providerFactory = AppCheckDebugProviderFactory()
      AppCheck.setAppCheckProviderFactory(providerFactory)
      FirebaseApp.configure()
    return true
  }
}

class YourAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
    return AppAttestProvider(app: app)
//      return DeviceCheckProvider(app: app)
  }
}
  • 验证App Check令牌的Firebase云函数代码:
exports.callGPT = functions.https.onRequest(async (request, response) => {
  try {
    // Validate Firebase App Check token
    const appCheckToken = request.headers["x-firebase-appcheck"];
    if (!appCheckToken) {
      return response.status(401)
          .send("Unauthorized: App Check token missing");
    }

    // const appCheckResponse = await getAppCheck().verifyToken(appCheckToken);
    const appCheckResponse = await admin.appCheck()
        .verifyToken(appCheckToken);
    if (!appCheckResponse.valid) {
      return response.status(401)
          .send("Unauthorized: Invalid App Check token");
    }

    // Replace "YOUR_CHATGPT_API_KEY" with your actual ChatGPT API key
    const chatGPTApiKey = "sk-token";

    // Extract the input text from the request body
    // const inputText = "Hi";
    const inputText = request.body.text;

    // Make a request to the ChatGPT API
    const chatGPTResponse = await axios.post(
        "https://api.openai.com/v1/chat/completions",
        {
          model: "gpt-3.5-turbo",
          messages: [{role: "system", content: "You are a helpful assistant."},
            {role: "user", content: inputText}],
        },
        {
          headers: {
            "Content-Type": "application/json",
            "Authorization": "Bearer " + chatGPTApiKey,
          },
        },
    );

    // Extract the response from ChatGPT
    const chatGPTOutput = chatGPTResponse.data.choices[0].message.content;

    // Send the ChatGPT output as the response
    response.status(200).send({output: chatGPTOutput});
  } catch (error) {
    console.error("Error calling ChatGPT API:", error);
    response.status(500).send("Internal Server Error");
  }
});
  • 调用云函数的Swift代码:
func sendPrompt() async {
        showLoader = true
        AppCheck.appCheck().token(forcingRefresh: false) { token, error in
            if let token = token {
                guard let url = URL(string: "baseurl/callGPT") else {
                    return
                }

                var request = URLRequest(url: url)

                request.httpMethod = "POST"
                request.setValue("application/json", forHTTPHeaderField: "Content-Type")
                request.setValue(token.token, forHTTPHeaderField: "X-Firebase-AppCheck")
                
                struct RequestObj: Codable, Hashable{
                    var text: String?
                }
                var requestObj = RequestObj(text: topic)
                let scriptData = try? JSONEncoder().encode(requestObj)
                request.httpBody = scriptData

                let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
                    if let error = error {
                        print("Error in app script: \(error)")
                    } else if let data = data, let responseString = String(data: data, encoding: .utf8) {
                        print("responseString = \(responseString)")
                        do {
                            struct ResponseObj: Codable, Hashable{
                                var output:String?
                            }
                            var responseObj = try JSONDecoder().decode(ResponseObj.self, from: data)
                            output = responseObj.output ?? ""
                            print("output = \(output)")
                        } catch {
                            print("an error occurred", error)
                        }
                    }
                    showLoader = false
                }

                task.resume()
            } else if let error = error {
                print ("AppCheck error: \(error as NSError).userInfo)")
            }
        }
    }

物理设备运行时,仍提示「无效App Check令牌」错误。


Xcode模拟器端尝试的修改

  • 修改App Delegate代码:
class AppDelegate: NSObject, UIApplicationDelegate {
  func application(_ application: UIApplication,
                   didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
    
//      let providerFactory = YourAppCheckProviderFactory()
      let providerFactory = AppCheckDebugProviderFactory()
      AppCheck.setAppCheckProviderFactory(providerFactory)
      FirebaseApp.configure()
    return true
  }
}

class YourAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
    return AppAttestProvider(app: app)
//      return DeviceCheckProvider(app: app)
  }
}
  • 在「Arguments Passed on Launch」中添加-FIRDebugEnabled
  • 在Firebase控制台添加调试令牌

云函数与Swift代码保持不变,但仍无法在云函数中验证App Check令牌。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:25:19