Firebase Messaging(Web端)获取订阅主题返回401错误求助
解决Firebase IID API获取订阅主题列表401错误的办法
问题根源
你碰到的401错误,本质是当前IID API的权限规则已更新:之前可用的Legacy服务器密钥已停用,你现在用的客户端公开api-key没有调用该接口的权限;而私钥不能直接放在请求头里,需要先转换为合法的OAuth 2.0 Access Token才能生效。另外你之前的请求格式也有误——Authorization参数不该拼在查询字符串里,只能通过请求头传递。
具体解决办法
方法一:使用Firebase Admin SDK(官方推荐,最省心)
这是目前官方主推的稳定方案,无需手动处理权限验证:
- 从Firebase控制台「项目设置」→「服务账号」页面,下载项目的服务账号密钥(JSON格式)
- 初始化Admin SDK(以Node.js为例):
const admin = require('firebase-admin'); const serviceAccount = require('./你的密钥文件路径.json'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount) }); - 调用接口获取订阅主题:
async function getTokenSubscribedTopics(token) { const tokenInfo = await admin.messaging().getToken(token); return tokenInfo.topics; }
方法二:手动生成OAuth 2.0 Access Token调用HTTP API
如果无法使用Admin SDK,需通过服务账号密钥生成合法的AccessToken:
- 用服务账号密钥生成JWT,权限必须包含
https://www.googleapis.com/auth/firebase.messaging - 向
https://oauth2.googleapis.com/token发送POST请求,参数设置:grant_type:urn:ietf:params:oauth:grant-type:jwt-bearerassertion: 上述生成的JWT
- 拿到返回的
access_token后,将请求头设置为Authorization: Bearer <你的access_token>,再调用正确的IID API:
注意:查询字符串仅保留GET https://iid.googleapis.com/iid/info/<你的messaging-token>?details=truedetails=true,不要将Authorization参数拼入其中。
重要提醒
- 客户端的Web API Key仅用于客户端SDK初始化,不具备调用IID管理接口的权限,无需再尝试使用它
- 服务账号密钥需妥善保管,绝对不能暴露给客户端
- IID API属于FCM底层接口,优先使用Admin SDK可避免权限和版本兼容问题
内容的提问来源于stack exchange,提问作者Simon H
相关产品推荐
相关产品推荐

