使用FCM获取AccessToken突然报错“No key or keyFile set”求助
解决FCM推送中“No key or keyFile set”错误的方案
可能的原因及解决方向
1. google-auth-library版本兼容性问题
近期谷歌的google-auth-library存在版本迭代,旧版本的JWT初始化逻辑可能不再兼容新的服务账号字段或认证规则:
- 可以通过
npm list google-auth-library查看当前版本,尝试锁定到之前能正常工作的版本,或升级到最新稳定版后调整初始化方式。
2. 私钥格式解析异常
私钥字符串的换行符处理不当是常见诱因,复制粘贴时容易丢失\n导致解析失败:
- 验证
private_key中的换行符是否完整,确保-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----前后的换行正确。 - 更可靠的方式是将服务账号私钥保存为JSON文件,通过
keyFile参数加载,避免字符串转义问题:const jwtClient = new google.auth.JWT( key.client_email, './path/to/your-service-account.json', null, SCOPES, null );
3. 新字段universe_domain引发的解析问题
新生成的服务账号JSON包含universe_domain字段,旧版本的google-auth-library可能无法识别该字段,触发认证错误:
- 从
key对象中移除"universe_domain": "googleapis.com"字段后再初始化JWT客户端,调整后的代码示例:function getAccessToken() { return new Promise(function (resolve, reject) { const key = { "type": "service_account", "project_id": "myid", "private_key_id": "myprivateid", "private_key": "-----BEGIN PRIVATE KEY-----myprivatekey\n-----END PRIVATE KEY-----\n", "client_email": "xxxx.iam.gserviceaccount.com", "client_id": "xxxx", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xxxx.iam.gserviceaccount.com" }; const jwtClient = new google.auth.JWT( key.client_email, null, key.private_key, SCOPES, null ); jwtClient.authorize(function (err, tokens) { if (err) { reject(err); return; } resolve(tokens.access_token); }); }); }
4. 服务账号权限验证
确认服务账号的FCM相关权限未被误删:
- 登录Google Cloud控制台,进入IAM页面,找到对应服务账号,确保其拥有
Firebase Cloud Messaging Admin角色或包含cloudmessaging.messages.send权限的自定义角色。
内容的提问来源于stack exchange,提问作者DominikReber
相关产品推荐
相关产品推荐

