启用Firebase App Check后仍无法阻止外部调用云函数的排查方法
排查Firebase App Check对Express Cloud Functions不生效的问题
以下是针对你的情况的具体排查步骤:
1. 核心误区:enforceAppCheck: true 对 https.onRequest 函数不自动生效
你使用的是基于Express的https.onRequest函数,但Firebase的enforceAppCheck: true配置仅对Callable Functions(https.onCall)自动生效。对于onRequest类型的HTTP函数,必须手动添加App Check令牌验证逻辑,否则设置的enforceAppCheck参数不会起任何作用。
解决方法:在Express应用中添加App Check验证中间件,示例代码如下:
const admin = require('firebase-admin'); admin.initializeApp(); // 定义App Check验证中间件 const verifyAppCheck = async (req, res, next) => { const appCheckToken = req.headers['x-firebase-appcheck']; if (!appCheckToken) { return res.status(401).send('Missing App Check token'); } try { // 验证令牌 const claims = await admin.appCheck().verifyToken(appCheckToken); req.appCheckClaims = claims; next(); } catch (error) { return res.status(403).send('Invalid or expired App Check token'); } }; // 给需要保护的路由挂载中间件 app.use('/your-protected-endpoints', verifyAppCheck);
2. 检查Firebase项目的App Check全局配置
- 进入Firebase控制台的「App Check」页面,找到「Cloud Functions」服务条目,确认其验证状态为强制验证(而非「允许未验证的请求」或调试模式)。
- 若当前处于开发调试模式,App Check会放宽验证限制,导致外部请求可直接访问。需切换至生产模式,确保仅携带有效令牌的请求能通过。
3. 确认是否存在调试令牌或IP豁免
- 检查App Check控制台的「调试」标签页,是否添加了全局调试令牌。若存在,携带该令牌的任何请求(包括curl)都会被允许访问。
- 查看是否设置了IP豁免列表,若你的桌面IP在豁免范围内,curl请求会直接绕过验证。
4. 验证iOS端是否正确发送App Check令牌
虽然应用内调用正常,但需确认iOS端是否将App Check令牌附加到请求头中:
- 抓包查看应用请求的
X-Firebase-AppCheck头是否存在且有效。 - iOS端调用Cloud Functions时,需手动获取令牌并添加到请求头,示例代码:
import FirebaseAppCheck // 获取App Check令牌 guard let appCheckToken = try? await FirebaseAppCheck.appCheck().token(forcingRefresh: false)?.token else { // 处理令牌获取失败 return } // 构建请求并添加令牌头 var request = URLRequest(url: URL(string: "YOUR_FUNCTION_URL")!) request.setValue(appCheckToken, forHTTPHeaderField: "X-Firebase-AppCheck") // 发送请求 let task = URLSession.shared.dataTask(with: request) { data, response, error in // 处理响应 } task.resume()
5. 确认函数部署状态
- 确保添加了验证逻辑的函数已重新部署成功,可通过
firebase deploy --only functions重新部署。 - 用
firebase functions:log --function myfunc查看函数的部署日志,确认没有部署错误,且运行的是最新版本。
6. 查看函数日志细节
- 不要找「callable-request-verification」日志,该日志仅针对Callable Functions。
- 查看
myfunc函数的具体请求日志,检查验证中间件是否被触发,是否有令牌验证失败的记录,以此确认验证逻辑是否正常执行。
内容的提问来源于stack exchange,提问作者Vlad Grigorov
相关产品推荐
相关产品推荐

