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个月的用户访问
核心思路是记录用户的最近登录时间,在规则中校验时间差,具体步骤如下:
同步用户登录时间到Firestore
- 利用Firebase Cloud Functions的
onAuthStateChanged触发器,在用户首次登录或每次刷新认证时,把Auth返回的last_sign_in_time同步到Firestore的users/{uid}文档中,比如存为lastLoginTimestamp字段。 - 一定要通过后端函数同步,禁止前端修改这个字段,避免用户篡改时间绕过限制。
- 利用Firebase Cloud Functions的
编写带时间校验的安全规则
在规则中读取用户文档的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}文档还未创建(同步逻辑未触发),规则会拒绝访问,可添加容错逻辑,比如允许首次登录的用户临时访问,或者在触发器中确保用户文档随登录同步创建。
- 注意:如果新用户的
进阶强化方案
- 若要强制用户每2个月必须重新登录,可以定期通过Cloud Functions遍历用户列表,检查
lastSignInTime,对超过2个月的用户调用revokeRefreshTokens,吊销其刷新令牌,用户必须重新登录才能恢复访问,同时自动更新Firestore中的登录时间。
- 若要强制用户每2个月必须重新登录,可以定期通过Cloud Functions遍历用户列表,检查
内容的提问来源于stack exchange,提问作者devblock
相关产品推荐
相关产品推荐

