如何通过Firebase CLI或类似方式生成授权用户的ID Token?
如何通过Firebase CLI/脚本生成ID Token保护HTTP函数
Firebase CLI没有直接提供generate-id-token命令,但可以通过以下两种方式生成符合要求的ID Token:
方式一:结合Firebase CLI与Auth REST API生成
- 登录并切换到目标项目:
firebase login firebase use <你的项目ID> - 获取当前登录用户的刷新令牌:
- Mac/Linux:查看
~/.config/firebase/config.json文件中的refreshToken字段 - Windows:查看
%APPDATA%\Roaming\firebase\config.json文件中的refreshToken字段
- Mac/Linux:查看
- 调用Auth REST API交换ID Token:
返回结果中curl 'https://securetoken.googleapis.com/v1/token?key=<你的项目API密钥>' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'grant_type=refresh_token&refresh_token=<刚才获取的刷新令牌>'id_token字段就是有效期1小时的ID Token。
方式二:用Firebase Admin SDK编写脚本生成
- 安装依赖:
npm install firebase-admin node-fetch - 创建生成脚本(比如
generate-token.js):const admin = require('firebase-admin'); const fetch = require('node-fetch'); const serviceAccount = require('./service-account-key.json'); // 替换成你的服务账号密钥路径 admin.initializeApp({ credential: admin.credential.cert(serviceAccount), }); // 替换成需要生成令牌的用户UID const targetUid = 'your-target-user-uid'; admin.auth().createCustomToken(targetUid) .then(customToken => { return fetch(`https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=<你的项目API密钥>`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token: customToken, returnSecureToken: true }) }); }) .then(res => res.json()) .then(data => { console.log('生成的ID Token:', data.idToken); process.exit(0); }) .catch(err => { console.error('生成失败:', err); process.exit(1); }); - 运行脚本生成令牌:
node generate-token.js
在Express中间件中验证ID Token
将以下验证逻辑加入你的Firebase函数,确保只有持有有效ID Token的请求能访问:
const admin = require('firebase-admin'); // 初始化Admin SDK(若未初始化) admin.initializeApp(); const verifyAuthToken = (req, res, next) => { const authHeader = req.headers.authorization; if (!authHeader || !authHeader.startsWith('Bearer ')) { return res.status(401).send('未提供有效令牌'); } const idToken = authHeader.split('Bearer ')[1]; admin.auth().verifyIdToken(idToken) .then(decodedToken => { req.user = decodedToken; next(); }) .catch(() => { res.status(401).send('令牌无效或已过期'); }); }; // 应用到受保护的路由 app.post('/your-protected-endpoint', verifyAuthToken, (req, res) => { res.send('已授权访问'); });
内容的提问来源于stack exchange,提问作者Sean McClure
相关产品推荐
相关产品推荐

