You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

GAS Web App带令牌执行报403 Forbidden问题求助

解决Google Apps Script Web App之间POST请求的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

火山引擎 最新活动