You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:49:12