如何通过指定服务账号限制Firestore的读写访问权限?
问题解答
首先明确核心逻辑:
Firebase Admin SDK 默认以项目管理员特权身份访问Firestore,会直接绕过所有安全规则——不管你设置什么规则,只要服务账号拥有对应的IAM权限,就能自由读写。但如果你想要彻底限制只有指定的这个服务账号能访问Firestore(包括拦截其他特权身份或普通用户的请求),必须修改安全规则。
具体实现步骤
1. 更新Firestore安全规则
在规则中校验请求身份的邮箱是否为你的服务账号邮箱,这样只有该账号能通过规则校验。修改后的规则如下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if request.auth.token.email == "firebase-adminsdk-...@....iam.gserviceaccount.com"; } } }
2. 让Admin SDK遵守安全规则(可选但推荐)
默认Admin SDK会绕过规则,如果你想让自己的Admin请求也受上述规则约束(避免因权限配置失误导致的越权),可以在初始化Firestore时开启规则强制:
import admin = require('firebase-admin'); import { initializeApp } from 'firebase-admin/app'; const app = initializeApp({ credential: admin.credential.cert({ // 你的服务账号配置信息 } as any) }); // 初始化Firestore时开启规则强制 const db = admin.initializeFirestore(app, { enforceSecurityRules: true });
3. 权限验证
修改完成后,其他未授权的请求(比如普通用户的前端SDK请求)会被规则拦截,只有使用指定服务账号的Admin SDK能正常读写。
注意事项
- 确保服务账号的IAM权限:默认创建的Firebase服务账号已具备
Cloud Datastore User权限,足以读写Firestore;如果权限不足,需要在Google Cloud控制台给账号添加对应权限。 - 规则中的邮箱必须和服务账号
client_email字段完全一致,不能有拼写错误。
内容的提问来源于stack exchange,提问作者emmby
相关产品推荐
相关产品推荐

