生成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
相关产品推荐
相关产品推荐

