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

生成Firebase Messaging V1 API Bearer Token时遇无效JWT签名错误求助

Firebase Messaging V1 API Bearer Token 生成错误解决指南

问题重现

代码片段

def Generate Token():
        try:
            SCOPES = ['https://www.googleapis.com/auth/firebase.messaging']
            SERVICE_ACCOUNT_FILE = os.path.join(settings.BASE_DIR, 'api', 'service-account.json')
            
            # Load the service account credentials
            credentials =            service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE,scopes=SCOPES)
            credentials.refresh(Request())
            
            return credentials.token
        except Exception as e:
            return "Error Getting TOken : "+ str(e)

错误信息

生成Token时的错误:

Access Toke : Error Getting TOken : ('invalid_grant: Invalid JWT Signature.', {'error': 'invalid_grant', 'error_description': 'Invalid JWT Signature.'})

使用Token发送通知时的401错误:

Response status code: 401
Response data: {'error': {'code': 401, 'message': 'Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See ...', 'status': 'UNAUTHENTICATED'}}


解决步骤

1. 校验服务账号文件完整性

  • 确认service-account.json是直接从Firebase控制台下载的原始文件,不要手动修改任何字段。重点检查private_key字段:必须以-----BEGIN PRIVATE KEY-----开头,-----END PRIVATE KEY-----结尾,中间的密钥内容不能有换行丢失或多余空格。
  • 核对文件中的project_id是否与你的Firebase项目ID完全一致,避免项目不匹配导致签名无效。

2. 修正代码语法错误

  • 函数名不能包含空格,把def Generate Token()改为符合Python规范的def generate_token()。
  • 去掉credentials =后的多余空格,修正后的代码行:
    credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    
  • 确保已正确导入所需模块:
    from google.oauth2 import service_account
    from google.auth.transport.requests import Request
    

3. 配置正确的服务账号权限

  • 登录Google Cloud控制台,找到对应项目的服务账号,为其分配Firebase Cloud Messaging Admin角色,确保账号拥有发送消息的权限。
  • 确认服务账号未被禁用,状态为正常可用。

4. 优化Token刷新逻辑(可选)

手动调用refresh()前先检查凭证是否有效,避免不必要的刷新操作:

def generate_token():
    try:
        SCOPES = ['https://www.googleapis.com/auth/firebase.messaging']
        SERVICE_ACCOUNT_FILE = os.path.join(settings.BASE_DIR, 'api', 'service-account.json')
        credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
        
        # 仅在凭证失效时刷新
        if not credentials.valid:
            credentials.refresh(Request())
            
        return credentials.token
    except Exception as e:
        return f"Error Getting Token : {str(e)}"

5. 验证生成的Token有效性

生成Token后,可通过Google Token Info接口验证:将Token替换到对应地址访问,检查返回的scope是否包含https://www.googleapis.com/auth/firebase.messaging,同时确认expires_in字段显示的过期时间正常。


内容的提问来源于stack exchange,提问作者ZeeSHAN Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:42:40