如何在独立Python脚本中以普通用户身份验证访问Firebase Firestore(无需管理员权限服务账号)
解决方案:用Firebase Auth普通用户身份访问Firestore(无需服务账号)
完全可以实现!你考虑的用普通用户身份通过Firebase Auth登录,再访问Firestore的思路完全正确,而且不用自己造轮子,也不用额外编写后端端点——Firebase原生就支持这种客户端侧的访问模式,Python也有维护良好的第三方库可以直接用。
这种方式的核心优势是:每个员工用自己的Firebase Auth账号登录,权限由Firestore的安全规则严格控制,彻底避免了服务账号的全能权限风险,同时完全符合BaaS的轻量化需求。
具体实现步骤
1. 选择合适的Python库
推荐使用pyrebase4(这是原pyrebase的维护分支,适配了最新的Firebase API),它模拟了Web端Firebase SDK的功能,支持邮箱/密码登录、Firestore操作等核心能力。
安装命令:
pip install pyrebase4
2. 获取Firebase Web应用配置
从你的Firebase控制台中,找到对应项目的Web应用配置(不是服务账号的JSON文件),里面包含apiKey、authDomain、projectId等字段——这些是客户端SDK初始化必需的信息,完全安全可以分发给员工(它们只是标识你的Firebase项目,没有权限)。
3. 编写Python脚本
脚本支持从环境变量读取配置和账号信息,或者运行时让员工输入,避免硬编码敏感数据:
import pyrebase import os # 从环境变量加载Firebase配置,或直接填入(推荐用环境变量) firebase_config = { "apiKey": os.getenv("FIREBASE_API_KEY"), "authDomain": os.getenv("FIREBASE_AUTH_DOMAIN"), "projectId": os.getenv("FIREBASE_PROJECT_ID"), "storageBucket": os.getenv("FIREBASE_STORAGE_BUCKET"), "messagingSenderId": os.getenv("FIREBASE_MESSAGING_SENDER_ID"), "appId": os.getenv("FIREBASE_APP_ID") } # 初始化Firebase应用 firebase = pyrebase.initialize_app(firebase_config) auth = firebase.auth() db = firebase.firestore() # 获取用户登录凭证(优先环境变量,否则运行时输入) user_email = os.getenv("FIREBASE_USER_EMAIL") or input("请输入你的Firebase账号邮箱:") user_password = os.getenv("FIREBASE_USER_PASSWORD") or input("请输入你的账号密码:") try: # 邮箱密码登录 user = auth.sign_in_with_email_and_password(user_email, user_password) # 刷新令牌避免过期(可选,但长期运行的脚本建议加上) user = auth.refresh(user["refreshToken"]) id_token = user["idToken"] # 示例:读取Firestore集合数据 print("正在读取数据...") collection_ref = db.collection("你的目标集合名称") docs = collection_ref.get() for doc in docs: print(f"文档ID: {doc.id},内容: {doc.to_dict()}") except Exception as e: print(f"登录或数据读取失败:{str(e)}")
4. 配置Firestore安全规则
这一步是关键!必须通过安全规则限制登录用户的访问权限,比如只允许已认证用户读取特定集合,或者只能访问自己的数据:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 示例1:允许所有已认证用户读取指定集合 match /你的目标集合名称/{document} { allow read: if request.auth != null; // 如果需要写入权限,按需添加:allow write: if request.auth != null; } // 示例2:更细粒度权限——用户只能读取自己创建的文档(假设文档包含uid字段) // match /user-data/{document} { // allow read: if request.auth.uid == resource.data.uid; // } } }
额外说明
- 账号管理:你可以在Firebase控制台的Auth模块中创建员工账号,或者开启邮箱/密码注册让员工自行注册(根据你的需求选择)。
- 安全保障:员工的账号密码只用于Firebase Auth登录,不会接触到任何服务账号信息;所有数据访问都受安全规则约束,彻底规避权限泄露风险。
- 替代方案:如果不想用第三方库,也可以直接调用Firebase Auth的REST API获取ID token,再用这个token调用Firestore的REST API,但
pyrebase4已经封装了这些细节,更省心。
内容的提问来源于stack exchange,提问作者Michał Gacka
相关产品推荐
相关产品推荐

