Xcode中Firebase上传用户信息触发com.google.HTTPStatus 403错误
问题描述
在Xcode环境开发基于Firebase的简易应用,核心功能包含用户注册时上传用户名、密码、邮箱及个人头像。添加上传个人头像代码前功能运行正常,添加后注册流程完全失效,点击注册按钮控制台输出如下403错误:
2022-07-10 22:12:58.587723-0700 The Slap[13158:510029]
GTMSessionFetcher invoking fetch callbacks, data {length = 73, bytes =
0x7b0a2020 22657272 6f72223a 207b0a20 ... 2e220a20 207d0a7d }, error
Error Domain=com.google.HTTPStatus Code=403 "(null)"
UserInfo={data={length = 73, bytes = 0x7b0a2020 22657272 6f72223a
207b0a20 ... 2e220a20 207d0a7d }, data_content_type=application/json;
charset=UTF-8}
关联代码
注册方法实现
@objc func handleRegister() { guard let profileImage = profileImage else { self.errorLabel.text = "Please select a profile image" return } guard let email = emailTextField.text else {return} guard let password = passwordTextField.text else {return} guard let fullName = nameTextField.text else {return} guard let userName = usernameTextField.text else {return} guard let imageData = profileImage.jpegData(compressionQuality: 0.3) else { return } let filename = NSUUID().uuidString let storageRef = STORAGE_PROFILE_IMAGES.child(filename) storageRef.putData(imageData, metadata: nil) { meta, error in storageRef.downloadURL { url, error in guard let profileImageUrl = url?.absoluteString else { return } if let error = error { print(error) return } Auth.auth().createUser(withEmail: email, password: password) { result, error in if let error = error { print(error) self.errorLabel.text = "\(error.localizedDescription)" return } guard let uid = result?.user.uid else { return } let values = ["email": email, "password": password, "fullName": fullName, "username": userName, "profileImageUrl": profileImageUrl] print("DEGUG: Successfully registered user") REF_USERS.child(uid).updateChildValues(values) { error, ref in print("DEBUG: Successfully updated user information") } } } } }
Firebase常量定义
import Firebase let DB_REF = Database.database().reference() //User Reference let REF_USERS = DB_REF.child("users") //Images let STORAGE_REF = Storage.storage().reference() let STORAGE_PROFILE_IMAGES = STORAGE_REF.child("profile_images")
排查方向
报错为HTTP 403权限拒绝,触发点在头像上传到Firebase Storage的环节,按以下优先级排查修复:
- 核心问题:执行顺序逻辑错误。Firebase Storage默认安全规则仅允许已认证用户执行写入操作,当前代码先执行头像上传,再调用
createUser完成用户注册,上传头像时用户还未生成认证身份,没有合法操作权限,直接触发拦截。将执行顺序调整为:先完成邮箱密码注册拿到用户uid和有效认证态,再上传头像、获取头像下载URL,最后把用户信息写入Realtime Database即可。 - 代码缺陷:当前
putData回调中没有先判断上传错误,直接调用downloadURL方法,导致上传阶段的错误被吞掉,无法拿到明确的报错提示。修复时在putData回调第一行先判断error是否存在,存在就直接打印错误、终止流程并给用户对应提示。 - 规则校验:调整执行顺序后如果仍报403,进入Firebase控制台查看Storage安全规则配置,测试阶段可临时配置为允许认证用户读写验证逻辑,上线前再按最小权限原则收紧规则。
- 安全问题:不要在待写入数据库的
values字典中传入明文密码,Firebase Auth已经安全托管了用户的账号凭证,额外存储明文密码属于严重安全隐患,直接从字段列表中删除password项即可。
内容的提问来源于stack exchange,提问作者ploppyfenis
相关产品推荐
相关产品推荐

