生产环境Firebase Function调用失败(iOS/Swift):重定向过多问题
问题场景
在iOS/Swift中调用Firebase Function的代码如下:
let functions = Functions.functions() func callWrapper(funcName: String, data: Any? = nil) async -> [String: Any]? { do { let result = try await functions.httpsCallable(funcName).call(data) return result.data as? [String : Any] } catch { if let error = error as NSError? { if error.domain == FunctionsErrorDomain { let code = FunctionsErrorCode(rawValue: error.code) let message = error.localizedDescription let details = error.userInfo[FunctionsErrorDetailsKey] } //todo handle print(error) } return nil } }
调用时出现以下错误:
2023-01-05 22:29:48.821609+0200 wallpapers[41492:641302] Task
<50374BAD-C312-450E-9770-B8300BE8FDB9>.<1> finished with error [-1007]
Error Domain=NSURLErrorDomain Code=-1007 "too many HTTP redirects"
UserInfo={NSLocalizedDescription=too many HTTP redirects,
NSErrorFailingURLStringKey=https://accounts.google.com/v3/signin/rejected?continue=https://uc.appengine.google.com/_ah/conflogin?state%3D~AJKiYcH_jc-hcv6OubZGrM13BmNN37rWX4x6rmTm7rZ4-Lqnr9Kk2C00oVNYR97TOiJ8lcR7vP91c9rv6o89HuwIlj85hxjrj63gbmu1jzGKzkU6S_kvHXv7yGdtaOWJnImTm02c6w9igKt3PbbWcawMsOafXEizRAd8jrT0jSe704DhXZ51m8IgAKv0kXxnblLuu3-DFmm-Uvi30sCPXIRGr_XG2DrMenI-zYGRjTiXf2uBVzIom7nVmKoCxIS7dGTvQozrDisq&dsh=S-1861899242:1672950586288679&flowEntry=ServiceLogin&flowName=WebLiteSignIn&ifkv=AeAAQh7QjO_naDvlYC2CVX-wduN9ft7CbGKMTlrMDHmAba7cHNPiDVDd4AQJzvAJgPnBpbS7sCeK0w&rhlk=no&rrk=32,
NSErrorFailingURLKey=https://accounts.google.com/v3/signin/rejected?continue=https://uc.appengine.google.com/_ah/conflogin?state%3D~AJKiYcH_jc-hcv6OubZGrM13BmNN37rWX4x6rmTm7rZ4-Lqnr9Kk2C00oVNYR97TOiJ8lcR7vP91c9rv6o89HuwIlj85hxjrj63gbmu1jzGKzkU6S_kvHXv7yGdtaOWJnImTm02c6w9igKt3PbbWcawMsOafXEizRAd8jrT0jSe704DhXZ51m8IgAKv0kXxnblLuu3-DFmm-Uvi30sCPXIRGr_XG2DrMenI-zYGRjTiXf2uBVzIom7nVmKoCxIS7dGTvQozrDisq&dsh=S-1861899242:1672950586288679&flowEntry=ServiceLogin&flowName=WebLiteSignIn&ifkv=AeAAQh7QjO_naDvlYC2CVX-wduN9ft7CbGKMTlrMDHmAba7cHNPiDVDd4AQJzvAJgPnBpbS7sCeK0w&rhlk=no&rrk=32,
_NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <50374BAD-C312-450E-9770-B8300BE8FDB9>.<1>" ), _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <50374BAD-C312-450E-9770-B8300BE8FDB9>.<1>,
NSUnderlyingError=0x6000005f7c00 {Error Domain=kCFErrorDomainCFNetwork
Code=-1007 "(null)"}}.
但使用本地Firebase模拟器时可以正常运行:
functions.useEmulator(withHost: "localhost", port: 5001)
问题解答
Firebase Functions允许未授权用户调用,但需要正确配置函数的权限规则,你遇到的too many HTTP redirects错误正是因为权限配置不当,导致请求被强制跳转到认证页面,进而引发循环重定向。
解决步骤如下:
配置云函数IAM权限
- 进入Firebase控制台,打开「云函数」页面
- 找到目标函数,点击进入后切换到「权限」标签页
- 点击「添加主體」,输入
allUsers并选择该主体 - 为
allUsers授予「Cloud Functions Invoker」角色
注意:公开函数存在安全风险,请确保函数内部没有敏感操作,或在函数逻辑中添加必要的校验逻辑(比如参数验证)
检查云函数代码中的认证逻辑
如果你的云函数代码中存在强制校验用户身份的逻辑(比如判断context.auth非空),需要移除或调整这部分代码,允许匿名用户访问确认客户端初始化正确
确保App启动时已正确初始化FirebaseApp,你的Swift调用代码本身无需修改,保持匿名调用即可
内容的提问来源于stack exchange,提问作者Olexander Korenyuk

