Firestore安全规则:允许手机号注册用户访问?request.auth.token.phone_number无效
手机号注册用户权限校验规则失效的根因与调整方案
规则失效的常见触发原因
- 校验逻辑未做空值兜底:当
request.auth为null(未登录状态)时,直接访问request.auth.token.phone_number字段会触发规则运行时异常 - 测试时未强制刷新ID Token:手机号绑定/登录完成后,客户端本地缓存的旧ID Token不会自动携带
phone_numberclaim,直接发起的操作请求会因为token字段缺失被规则拦截 - 自定义Auth场景下漏配claim:如果是通过Admin SDK自定义生成手机号登录的token,没有手动把
phone_number字段写入token claim,会导致规则永远读不到对应字段 - 规则分支逻辑错位:把手机号字段的校验写在了未登录可访问的规则分支里,导致已登录用户的请求根本走不到对应的校验逻辑
注意:安全规则在运行时遇到字段访问异常时,会直接默认拒绝所有请求,且不会在日志中暴露具体的异常原因,这也是很多人觉得自己写的规则“不生效”的核心原因
正确的规则配置逻辑
核心校验必须先做登录态判断,再校验手机号字段的存在性,避免运行时异常:
// 通用校验片段,适用于Firestore、实时数据库、云存储的安全规则 request.auth != null && request.auth.token.phone_number != null
常见错误写法对照
- 错误写法1:未判断登录态直接访问token字段,触发规则运行异常
// 无效:request.auth为null时,访问token会直接导致规则判断失败 allow write: if request.auth.token.phone_number != null - 错误写法2:仅判断用户ID匹配,漏加手机号字段校验,导致所有已登录用户(无论注册方式)都能访问
完整可运行的规则示例(以Firestore为例)
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 配置规则:仅手机号注册的用户可读写自身名下的数据集 match /personal_data/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId && request.auth.token.phone_number != null; } } }
快速调试技巧
- 优先使用Firebase控制台内置的规则模拟器,选择手机号登录的模拟身份发起请求,查看token payload中是否确实存在
phone_number字段,避免真机测试的环境缓存干扰 - 客户端完成手机号登录/绑定操作后,调用
getIdToken(true)强制刷新本地token,再发起后续数据操作 - 确认用户的注册属性:通过匿名登录后后续补绑手机号的用户,在绑定操作完成前生成的ID Token不会携带
phone_number字段,需等绑定完成重新生成token后才能通过校验
内容的提问来源于stack exchange,提问作者HasanToufiqAhamed
相关产品推荐
相关产品推荐

