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

Firestore安全规则:长期登录用户权限及查询访问过期设置

Firestore安全规则与用户登录时长问题解析

requires-recent-login错误的触发场景

  • 这个错误不会因为用户登录时长(比如2个月)自动触发。它仅针对敏感身份操作,比如修改邮箱、密码、删除账号这类涉及用户核心权限变更的动作,普通的Firestore读写/查询完全不受这个限制。
  • 只要用户的认证会话有效(SDK会自动刷新1小时有效期的ID Token,只要设备在线、未主动登出,会话会一直维持),就能无限进行普通读写操作。

Firebase默认的登录时长限制

  • Firebase Auth的ID Token默认1小时过期,但SDK会在后台自动刷新获取新令牌,不存在“登录满X个月自动失效”的默认限制。只要用户不主动登出、设备能正常联网,认证状态会一直保持。
  • 如果要强制让登录会话失效,只能通过Firebase Auth管理API调用revokeRefreshTokens方法,吊销用户的刷新令牌,用户下次操作时就必须重新登录。

如何在Firestore规则中限制登录不超2个月的用户访问

核心思路是记录用户的最近登录时间,在规则中校验时间差,具体步骤如下:

  1. 同步用户登录时间到Firestore

    • 利用Firebase Cloud Functions的onAuthStateChanged触发器,在用户首次登录或每次刷新认证时,把Auth返回的last_sign_in_time同步到Firestore的users/{uid}文档中,比如存为lastLoginTimestamp字段。
    • 一定要通过后端函数同步,禁止前端修改这个字段,避免用户篡改时间绕过限制。
  2. 编写带时间校验的安全规则
    在规则中读取用户文档的lastLoginTimestamp,计算当前时间与该时间的差值是否小于2个月(按每月30天算,2个月约为5184000000毫秒,可根据实际需求调整):

    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        // 全局读写限制,可根据集合细化
        match /{document=**} {
          allow read, write: if request.auth != null 
            && (request.time - get(/databases/$(database)/documents/users/$(request.auth.uid)).data.lastLoginTimestamp) < 5184000000;
        }
      }
    }
    
    • 注意:如果新用户的users/{uid}文档还未创建(同步逻辑未触发),规则会拒绝访问,可添加容错逻辑,比如允许首次登录的用户临时访问,或者在触发器中确保用户文档随登录同步创建。
  3. 进阶强化方案

    • 若要强制用户每2个月必须重新登录,可以定期通过Cloud Functions遍历用户列表,检查lastSignInTime,对超过2个月的用户调用revokeRefreshTokens,吊销其刷新令牌,用户必须重新登录才能恢复访问,同时自动更新Firestore中的登录时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 06:11:22