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

如何在Xcode/Swift中设置Firebase Custom Claims

Firebase Swift 端设置 Custom Claims 说明

为什么官方没有提供客户端 Swift 设置接口

Custom Claims 属于权限级敏感配置,通常用于标识用户角色(如管理员、付费会员)、访问权限等核心安全属性,若允许客户端直接修改会导致权限体系完全失控。因此Firebase官方从设计上就不支持任何客户端(包括Swift iOS客户端)直接修改Custom Claims,仅开放服务端Admin SDK的修改能力,这也是你仅能找到服务端语言相关文档的原因。

可实现 Custom Claims 修改的 Swift 相关场景

  • 服务端 Swift 开发(基于Vapor等Swift服务端框架)

    可使用Firebase Admin Swift SDK完成Custom Claims设置,示例代码如下:

    import FirebaseAdmin
    
    // 初始化Firebase Admin SDK(仅需执行一次)
    guard let app = FirebaseApp.app() else {
        try FirebaseApp.configure()
    }
    
    // 给指定UID的用户设置Custom Claims
    let uid = "目标用户的UID"
    let claims: [String: Any] = [
        "isAdmin": true,
        "paidTier": "premium"
    ]
    
    do {
        try await Auth.auth().setCustomUserClaims(claims, forUID: uid)
        print("Custom Claims 设置成功")
    } catch {
        print("设置失败: \(error.localizedDescription)")
    }
    
  • iOS 客户端 Swift 开发

    客户端不能直接修改Claims,必须通过服务端中转实现:

    1. 自行搭建后端服务,或者编写Firebase Cloud Functions可调用接口,在服务端侧完成Custom Claims的修改逻辑
    2. iOS客户端通过HTTPS请求或者Functions.functions().httpsCallable()调用对应接口触发修改,客户端调用示例如下:
    import FirebaseFunctions
    
    let functions = Functions.functions()
    // 调用你部署的云函数接口,传入需要设置的参数
    functions.httpsCallable("updateUserClaims").call([
        "targetUid": "要修改的用户UID",
        "isAdmin": true
    ]) { result, error in
        if let error = error {
            print("调用失败: \(error.localizedDescription)")
            return
        }
        // 修改成功后需要刷新本地ID Token才能拿到最新Claims
        Auth.auth().currentUser?.getIDTokenResult(forcingRefresh: true) { tokenResult, error in
            guard let claims = tokenResult?.claims else { return }
            print("最新Claims: \(claims)")
        }
    }
    

Swift 客户端读取 Custom Claims 示例

如果你仅需要在客户端读取已设置的Claims,可直接通过本地ID Token获取:

Auth.auth().currentUser?.getIDTokenResult(completion: { tokenResult, error in
    guard let claims = tokenResult?.claims else { return }
    // 读取自定义字段
    let isAdmin = claims["isAdmin"] as? Bool ?? false
    let paidTier = claims["paidTier"] as? String ?? ""
})

内容的提问来源于stack exchange,提问作者Ethan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:36:08