iOS端调用Firebase HTTP可调用云函数返回401未认证错误如何解决?
问题排查与解决步骤
核心原因说明
Firebase实时数据库、Firestore的访问权限由Firebase安全规则控制,而HTTP可调用云函数的访问请求首先会经过Google Cloud Platform(GCP)的IAM权限校验,2020年之后GCP调整了云函数的默认权限策略,新部署的HTTP类型云函数默认关闭了未身份验证用户的调用权限,因此会出现其他服务正常、仅onCall云函数返回Unauthenticated错误的情况。
排查与解决方案
- 配置云函数IAM调用权限
这是该问题的最常见诱因,操作步骤如下: - 打开Google Cloud Console,进入「Cloud Functions」页面,找到对应的
test云函数 - 点击「权限」标签页,选择「授予访问权限」
- 在「新的主账号」输入框中填入对应主体,角色选择「Cloud Functions > Cloud Functions 调用者」后保存:
- 若允许所有用户(包含未登录用户)调用,填入
allUsers - 若仅允许已登录的Firebase Auth用户调用,填入
allAuthenticatedUsers,同时确保iOS端调用函数前,用户已经完成Firebase Auth登录流程
- 若允许所有用户(包含未登录用户)调用,填入
- 配置云函数IAM调用权限
- 核对云函数部署区域
若你部署云函数时指定了非默认的us-central1区域,需要在iOS端初始化Functions实例时明确指定对应区域,修改调用代码:
// 替换为你实际部署的区域,比如asia-east2、europe-west1等 let functions = Functions.functions(region: "你的部署区域") functions.httpsCallable("test").call() { res, error in if let error = error { debugPrint(error) } else { debugPrint(res?.data) } }- 核对云函数部署区域
- 验证函数名与本地测试
- 确认iOS端调用的函数名和云函数导出的名称完全一致,无拼写错误
- 可以通过Firebase本地模拟器排查线上权限问题,iOS端增加模拟器指向代码:
若本地模拟器调用正常,则可以确定问题出在线上IAM权限配置上。let functions = Functions.functions() // 指向本地云函数模拟器,默认端口为5001 functions.useEmulator(withHost: "localhost", port: 5001)
内容的提问来源于stack exchange,提问作者Imran Malik
相关产品推荐
相关产品推荐

