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

已删除的Firebase用户仍可创建文档,request.auth为何不为空?

问题核心原因

  • Firebase Auth 颁发的用户 ID 令牌是 有效期1小时的JWT凭证,令牌一旦成功颁发,在到期前会被默认视为有效。安全规则校验request.auth时只会校验令牌的签名合法性、是否在有效期内,不会实时同步校验 Authentication 后台的用户记录是否仍存在。
  • 你在控制台删除用户只是删除了后台的用户记录,已经颁发出去还没到期的令牌不会被自动作废,所以被删除用户的设备本地存的令牌还没过期的话,携带这个令牌发起的请求,request.auth就会返回非空,能通过你的现有规则校验。

解决方案

1. 客户端主动校验用户有效性

应用启动、自动登录前或者每次执行敏感操作前,主动调用重载用户接口校验用户状态,收到用户已删除的报错后,立即调用登出接口清理本地的用户缓存和过期令牌,阻止后续自动登录流程,示例代码:

Auth.auth().currentUser?.reload(completion: { error in
    if let err = error as NSError?, err.code == AuthErrorCode.userNotFound.rawValue {
        // 用户已被删除,执行登出逻辑清理本地缓存
        try? Auth.auth().signOut()
        // 后续跳转至登录页等业务逻辑
    }
})

你也可以调用getIDTokenResult(forcingRefresh: true)触发强制刷新令牌,效果和reload一致,同样会返回用户不存在的错误。

2. 安全规则层面增强拦截(高安全场景可选)

如果需要从服务端层面实时拦截已删除用户的所有请求,可以结合Cloud Functions维护已删除用户的UID黑名单:

  1. 绑定用户删除事件的Cloud Functions触发器,用户被删除时将其UID写入专门的黑名单集合(例如deleted_uids),同时可以给集合配置TTL自动清理超过1小时的记录(因为ID令牌最长有效期仅为1小时,超时的黑名单记录无实际作用)。
  2. 修改安全规则增加黑名单校验逻辑:
match /databases/{database}/documents {
    // 校验当前请求的用户UID不在已删除黑名单内
    function isUserValid() {
        return request.auth != null && !exists(/databases/$(database)/documents/deleted_uids/$(request.auth.uid))
    }
    
    match /users/{userId} {
      allow read, write: if isUserValid() && request.auth.uid == userId;

      match /{document=**} {
        allow read, write: if isUserValid() && request.auth.uid == userId;
      }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 15:57:03