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

