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

Gmail插件App Script调用带Auth头Firebase API时获取IdToken遇错求助

解决Firebase ID Token获取时的INVALID_IDP_RESPONSE错误

你遇到的错误INVALID_IDP_RESPONSE : Invalid Idp Response: access_token audience is not for this project,核心原因是**ScriptApp.getOAuthToken()返回的令牌受众(audience)不是你的Firebase项目**。这个令牌是针对Google Apps Script自身API权限设计的,无法直接用于Firebase的身份验证流程。

下面是具体的解决方案:

1. 获取Firebase项目的OAuth客户端ID

首先,你需要从Firebase控制台拿到对应Web应用的OAuth 2.0客户端ID:

  • 打开Firebase控制台 → 进入你的项目 → 点击左侧「项目设置」→ 切换到「应用」标签页
  • 找到你创建的Web应用,点击「SDK设置和配置」→ 复制「OAuth 2.0客户端ID」(如果没看到,点击「前往Google Cloud控制台」,在「凭据」页面找到对应Web应用的客户端ID)

2. 使用OAuth2库获取针对Firebase的用户令牌

由于Apps Script原生的ScriptApp.getOAuthToken()无法满足需求,我们需要借助官方的OAuth2库来获取受众为Firebase项目的用户令牌:

步骤2.1 添加OAuth2库到你的Apps Script项目

  • 打开你的Apps Script编辑器 → 点击左侧「库」图标 → 点击「添加库」
  • 输入库的脚本ID:1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF → 选择最新版本 → 点击「添加」

步骤2.2 配置OAuth服务并获取令牌

替换你原有的getGoogleIDToken()函数为以下代码:

function getGoogleIDToken() {
  const FIREBASE_CLIENT_ID = "你的Firebase OAuth客户端ID"; // 替换为你刚才复制的ID
  const firebaseConfig = {
    apiKey: "你的Firebase API Key",
    authDomain: "你的Firebase Auth Domain"
  };

  // 创建OAuth服务
  const oauthService = OAuth2.createService('FirebaseAuth')
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://oauth2.googleapis.com/token')
    .setClientId(FIREBASE_CLIENT_ID)
    .setClientSecret('你的客户端密钥') // 从Google Cloud控制台凭据页面获取对应客户端的密钥
    .setCallbackFunction('authCallback')
    .setScope('openid email profile')
    .setParam('access_type', 'offline')
    .setParam('prompt', 'select_account');

  // 如果令牌已过期,重新授权
  if (!oauthService.hasAccess()) {
    const authorizationUrl = oauthService.getAuthorizationUrl();
    Logger.log('请访问以下URL授权:' + authorizationUrl);
    throw new Error('需要授权,请查看日志中的授权链接');
  }

  // 获取针对Firebase的access_token
  const googleAccessToken = oauthService.getAccessToken();

  // 调用Firebase的signInWithIdp接口获取ID Token
  const res = UrlFetchApp.fetch(
    `https://identitytoolkit.googleapis.com/v1/accounts:signInWithIdp?key=${firebaseConfig.apiKey}`,
    {
      method: 'POST',
      payload: JSON.stringify({
        requestUri: `https://${firebaseConfig.authDomain}`,
        postBody: `access_token=${googleAccessToken}&providerId=google.com`,
        returnSecureToken: true
      }),
      contentType: 'application/json',
      muteHttpExceptions: true
    }
  );

  const responseData = JSON.parse(res.getContentText());
  if (responseData.error) {
    throw new Error(`Firebase认证失败:${responseData.error.message}`);
  }

  const idToken = responseData.idToken;
  Logger.log('获取到的Firebase ID Token:', idToken);
  return idToken;
}

// OAuth回调函数
function authCallback(request) {
  const oauthService = OAuth2.createService('FirebaseAuth');
  const isAuthorized = oauthService.handleCallback(request);
  return HtmlService.createHtmlOutput(isAuthorized ? '授权成功!可以关闭此页面了。' : '授权失败,请重试。');
}

步骤2.3 配置项目的OAuth权限

  • 在Apps Script编辑器中,点击「项目设置」→ 勾选「显示"appsscript.json"清单文件」
  • 打开appsscript.json,确保oauthScopes包含以下权限:
    "oauthScopes": [
      "https://www.googleapis.com/auth/script.external_request",
      "https://www.googleapis.com/auth/userinfo.email",
      "https://www.googleapis.com/auth/userinfo.profile"
    ]
    

3. 验证令牌的受众

你可以通过调用Google的令牌信息接口验证获取到的access_token是否正确:

function verifyAccessToken(token) {
  const res = UrlFetchApp.fetch(`https://oauth2.googleapis.com/tokeninfo?access_token=${token}`);
  Logger.log(JSON.parse(res.getContentText()));
}

返回结果中的aud字段应该和你的Firebase OAuth客户端ID一致,这样就能成功通过Firebase的身份验证了。


内容的提问来源于stack exchange,提问作者sachin bhola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:12:38