Firebase Admin认证在Python解释器正常,Django/Celery环境权限报错
问题原因与解决方案
核心原因
你在Python解释器中运行正常,是因为当前shell环境继承了gcloud auth activate-service-account设置的认证上下文——此时Python会使用你激活的拥有全权限的服务账号密钥。
而Celery作为后台服务启动时,不会继承你当前shell的环境变量和gcloud认证配置,它会默认使用GCP Compute Engine的默认服务账号。这个默认账号的权限范围(Scope)通常不包含Firestore的访问权限,因此触发ACCESS_TOKEN_SCOPE_INSUFFICIENT错误。
解决方法
方法1:在Celery/Django中显式指定服务账号密钥
不要依赖shell环境,直接在代码或配置中指定服务账号密钥文件路径:
- 方式A:设置环境变量(可在Celery启动脚本、Django settings.py中添加)
import os # 替换为你的服务账号密钥文件路径 os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/opt/app/service-account-key.json"
- 方式B:在初始化Firestore/Storage客户端时直接加载密钥
from google.oauth2 import service_account import firebase_admin from firebase_admin import credentials, firestore, storage # 加载服务账号密钥 cred = credentials.Certificate("/opt/app/service-account-key.json") firebase_admin.initialize_app(cred, { 'storageBucket': 'your-bucket-name.appspot.com' }) # 初始化客户端 db = firestore.client() bucket = storage.bucket()
方法2:扩展VM默认服务账号的权限范围
如果你不想修改代码,可以给VM的默认服务账号添加Firestore相关的权限范围:
- 进入GCP控制台的Compute Engine -> 虚拟机实例
- 找到你的E2-medium VM,点击编辑
- 在服务账号部分,点击更改范围
- 添加
Cloud Datastore(对应Firestore)的权限范围,保存后重启VM
这种方法的缺点是耦合VM配置,不如方法1灵活。
内容的提问来源于stack exchange,提问作者lesolorzanov
相关产品推荐
相关产品推荐

