GAS Web App带令牌执行报403 Forbidden问题求助
我之前也碰到过类似的跨Web App请求权限问题,结合你的配置和代码,这几个关键点是导致403错误的核心原因,咱们一步步来修复:
1. 执行身份不匹配导致权限冲突
你的第一个Web App执行身份是访问Web App的用户,这时候ScriptApp.getOAuthToken()获取的是当前访问用户的OAuth令牌,但第二个Web App的执行身份是你(部署者)。用普通用户的令牌去请求部署者身份的Web App,会因为权限不被允许而返回403。
修复方案:
重新部署第一个Web App,把执行身份改成我(部署者),这样ScriptApp.getOAuthToken()拿到的是你自己的令牌,和第二个Web App的执行身份一致,权限就能匹配上。
2. OAuth Scope格式错误
你的清单文件里的oauthScopes存在多余空格:
[" https://www.googleapis.com/auth/script.external_request ", " https://www.googleapis.com/auth/drive.readonly "]
每个scope前后的空格会导致Google无法识别有效的权限范围,进而影响令牌的权限。
修复方案:
去掉scope前后的空格,修正后的清单:
{ "oauthScopes": [ "https://www.googleapis.com/auth/script.external_request", "https://www.googleapis.com/auth/drive.readonly" ] }
3. 第二个Web App的访问权限设置
你提到第二个Web App的访问权限是“任何人”,但GAS的Web App部署里有两个选项:
- 任何人
- 任何人,甚至匿名
如果选的是第一个,即便是部署者的令牌请求,也可能需要额外的登录验证;选第二个才是完全公开的匿名访问。
修复方案:
重新部署第二个Web App,把访问权限改成任何人,甚至匿名,确保请求不需要额外登录验证。
4. 代码细节优化
你的第一个App返回响应时直接传递了response对象,如果是UrlFetchApp返回的响应对象,ContentService无法直接处理,需要调用getContentText()获取响应内容。另外要确保替换#url_to_second_app为第二个Web App的实际部署URL。
修正后的第一个App代码:
function doGet(e) { // 替换成你的第二个Web App部署URL var url = "https://script.google.com/macros/s/[你的第二个App部署ID]/exec"; var headers = { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }; var params = { "method": "post", "headers": headers, "muteHttpExceptions": true }; var response; try { response = UrlFetchApp.fetch(url, params); // 获取响应文本内容 response = response.getContentText(); } catch (err) { response = err.toString(); } Logger.log(response); return ContentService.createTextOutput(response); }
最后一步:重新部署两个Web App
每次修改配置或代码后,一定要点击部署菜单里的“部署为Web App”,选择“新版本”,确保修改生效。
按上面的步骤调整后,再调用第一个App的doGet函数,应该就能正常收到第二个App返回的"hello world!"了。
内容的提问来源于stack exchange,提问作者Szymon Romanowski




