You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase云函数调用FCM订阅主题时遭遇401 Unauthorized错误

问题概述

在Firebase云函数中使用Python SDK,通过默认服务账号初始化应用后,调用messaging.subscribe_to_topic批量让设备Token订阅FCM主题时,出现401未授权错误。使用Firebase控制台生成的凭证JSON初始化应用可正常运行,但该方式不适用于生产环境,需要依赖默认服务账号解决权限问题。

代码示例

from firebase_functions import https_fn
from firebase_admin import initialize_app
from firebase_admin import storage, db, auth, messaging, credentials

app = initialize_app()

@https_fn.on_call()
def subscribe_to_pool(req: https_fn.CallableRequest):
    return {
        "SUCCESS": messaging.subscribe_to_topic(
            req.data["tokens"], "pool"
        ).success_count == len(req.data["tokens"])
    }

错误日志

--- Logging error ---
Traceback (most recent call last):
  File "/home/sep/Desktop/sep/ypool/functions/venv/lib/python3.11/site-packages/firebase_admin/messaging.py", line 507, in make_topic_management_request
    resp = self._client.body(
           ^^^^^^^^^^^^^^^^^^
  File "/home/sep/Desktop/sep/ypool/functions/venv/lib/python3.11/site-packages/firebase_admin/_http_client.py", line 131, in body
    resp = self.request(method, url, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/sep/Desktop/sep/ypool/functions/venv/lib/python3.11/site-packages/firebase_admin/_http_client.py", line 119, in request
    resp.raise_for_status()
  File "/home/sep/Desktop/sep/ypool/functions/venv/lib/python3.11/site-packages/requests/models.py", line 1021, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://iid.googleapis.com/iid/v1:batchAdd

排查与解决步骤

  1. 核对服务账号权限
    默认的[project-id]@appspot.gserviceaccount.com服务账号虽自带基础权限,但必须确保它拥有Firebase Cloud Messaging Admin角色。注意:仅添加Firebase Admin角色不够,该角色不包含FCM主题订阅的具体权限。
  2. 检查IAM绑定配置
    登录Google Cloud控制台的IAM页面,找到该默认服务账号,确认已为其添加Firebase Cloud Messaging Admin角色。若未添加,直接配置后等待3-5分钟让权限生效。
  3. 确认云函数运行身份
    云函数默认使用默认服务账号运行,但如果手动指定过其他服务账号,需检查该账号是否同样具备FCM主题订阅权限。
  4. 验证初始化逻辑
    代码中initialize_app()不带参数的写法是正确的,云函数环境会自动加载默认服务账号的凭证,无需额外配置JSON文件。
  5. 本地模拟测试
    若权限配置后仍报错,可在本地测试时设置环境变量GOOGLE_APPLICATION_CREDENTIALS指向默认服务账号的JSON凭证文件(从Google Cloud控制台下载),模拟生产环境权限,排查是否为权限配置问题。

内容的提问来源于stack exchange,提问作者Sep Keuchenius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:27:38