Google apps script 作为web应用部署的Google Apps脚本存在身份验证问题

Google apps script 作为web应用部署的Google Apps脚本存在身份验证问题,google-apps-script,Google Apps Script,我在尝试从第二个GAS调用部署的应用程序脚本(作为web应用程序,可供“任何人”访问)时遇到HTTP 401错误,该脚本具有UrlFetch和授权标头中的承载。直到两周前,这些脚本已经运行了好几个月。 这里有两个小脚本来重现错误 脚本A-部署为web应用,可供“任何人”访问。 function doGet(e) { var params = e.parameter.params; console.info("Parameters : " + JSON.stringify(e.parame

我在尝试从第二个GAS调用部署的应用程序脚本(作为web应用程序,可供“任何人”访问)时遇到HTTP 401错误,该脚本具有UrlFetch和授权标头中的承载。直到两周前,这些脚本已经运行了好几个月。 这里有两个小脚本来重现错误

脚本A-部署为web应用,可供“任何人”访问。

function doGet(e) {
  var params = e.parameter.params;
  console.info("Parameters : " + JSON.stringify(e.parameter));
  return ContentService.createTextOutput("Success");
}
脚本B-通过UrlFetch调用脚本A

function callURL() {
  var param = {
    method      : "get",
    headers     : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
    followRedirects : true,
    muteHttpExceptions:true,
  };
  var url = "https://script.google.com/macros/s/<script_A_deployed_url>/exec?param1=test";
  var resp = UrlFetchApp.fetch(url,param);
  if(resp.getContentText() != "Success"){
    console.info(resp.getContentText());
    throw resp.getContentText();
  }
}
函数callURL(){
变量参数={
方法:“获取”,
标题:{“授权”:“承载者”+ScriptApp.getOAuthToken()},
以下重定向:正确,
muteHttpExceptions:true,
};
变量url=”https://script.google.com/macros/s//exec?param1=test";
var resp=UrlFetchApp.fetch(url,参数);
如果(分别为getContentText()!=“成功”){
console.info(resp.getContentText());
抛出相应的getContentText();
}
}

您能再次确认以下几点吗

  • 对于客户端,在项目中除了您的客户端脚本之外,还有其他一些功能吗?如果项目中只有脚本,那么访问Web应用程序的范围是不够的。驱动器API的作用域需要包含在访问令牌的作用域中。
    • 您可以在文件->项目属性->范围中查看当前范围
    • 例如,以下是作用域。
      • https://www.googleapis.com/auth/drive.readonly
      • https://www.googleapis.com/auth/drive.files
      • https://www.googleapis.com/auth/drive
  • 在我的日志中,当
    谁有权访问应用程序:
    作为
    任何人安装时,我确认从2018年4月11日起,需要共享项目才能访问Web应用程序。这可能是由于谷歌的更新。
    
    • 请与用户共享Web应用的项目,然后重试
  • 对于Web应用服务器端,如果将
    用户访问Web应用的
    设置为执行应用为:
    ,请使用自己的浏览器授权作用域。此授权只需执行一次
  • 如果这些对您的情况没有帮助,我很抱歉。

    为我指明了正确的方向。显然,最近在作为web应用部署的应用程序脚本的身份验证机制中更改了一些内部规则。 对于B脚本,UrlFetch的默认作用域是
    https://www.googleapis.com/auth/script.external_request
    ,但看起来我们现在至少需要对脚本的读取权限,这意味着我们还需要驱动器作用域。 为了实现这一点,例如,您可以在B脚本中使用此函数对其进行授权

    function setScope() {
      DriveApp.getRootFolder();
    }
    

    你试过用邮递员等做同样的事吗?是的,我设法用失眠来重现这种行为。确切的错误信息是什么?早期相同的设置和代码在401中工作,未经授权。是的,我们几个月来一直在使用此身份验证机制,没有任何问题。请尝试发布具有公共访问权限的应用程序(Anyopne,甚至匿名),看看是否有效,如果有效,然后确保标头正确到达Anks!你给我指出了正确的方向。现在看来,脚本B需要驱动器作用域和至少对脚本A的读取权限,以避免401错误。我将在新的答案中澄清这一点。@Q_C欢迎。最近,我总结了关于Web应用的内容。如果这对你有用,我很高兴。