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

如何通过Firebase CLI或类似方式生成授权用户的ID Token?

如何通过Firebase CLI/脚本生成ID Token保护HTTP函数

Firebase CLI没有直接提供generate-id-token命令,但可以通过以下两种方式生成符合要求的ID Token:

方式一:结合Firebase CLI与Auth REST API生成

  1. 登录并切换到目标项目:
    firebase login
    firebase use <你的项目ID>
    
  2. 获取当前登录用户的刷新令牌:
    • Mac/Linux:查看~/.config/firebase/config.json文件中的refreshToken字段
    • Windows:查看%APPDATA%\Roaming\firebase\config.json文件中的refreshToken字段
  3. 调用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编写脚本生成

  1. 安装依赖:
    npm install firebase-admin node-fetch
    
  2. 创建生成脚本(比如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);
      });
    
  3. 运行脚本生成令牌:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:31:17