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
相关产品推荐
相关产品推荐

