已删除的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黑名单:
- 绑定用户删除事件的Cloud Functions触发器,用户被删除时将其UID写入专门的黑名单集合(例如
deleted_uids),同时可以给集合配置TTL自动清理超过1小时的记录(因为ID令牌最长有效期仅为1小时,超时的黑名单记录无实际作用)。 - 修改安全规则增加黑名单校验逻辑:
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
相关产品推荐
相关产品推荐

