无法使用访问令牌访问部署为网络应用的Google Apps脚本

时间:2019-05-29 22:57:43

标签: google-apps-script oauth

我想进一步了解使用OAuth访问令牌访问Apps脚本网络应用程序时的工作方式。

这是Apps Script网络应用程序:

function doPost(e) {
  return ContentService.createTextOutput('ok');
}

function doGet(e) {
  return ContentService.createTextOutput('ok');
}

部署为:我

谁有权访问该应用:请参见下文

我使用Postman访问Apps Script Web应用程序。我调用了Web应用程序URL(以/exec结尾),并提供了标题Authorization: Bearer ACCESS_TOKEN

我使用Google OAuth Playground

生成访问令牌
  • 我以我的身份登录:它与每个“有权访问应用程序”权限的用户一起使用,这正是我所期望的。
  • 以域内其他人的身份登录:仅适用于“任何人,甚至匿名”权限,并且仅在传入请求没有Authorization标头时才有效。否则,我会收到403禁止错误。 我希望它适用于以下权限:
    • “任何人,甚至是匿名的”,即使请求具有“授权”标头
    • “任何人”
    • “域内的任何人”
  • 以域外其他人的身份登录:仅适用于“任何人,甚至匿名”权限,并且仅在传入请求没有Authorization标头时有效。否则,我会收到403禁止错误。 我希望它适用于以下权限:
    • “任何人,甚至是匿名的”,即使请求具有“授权”标头
    • “任何人”

我想念什么?

编辑

用于生成访问令牌的范围是https://www.googleapis.com/auth/drive

1 个答案:

答案 0 :(得分:1)

此解决方法如何?

规格:

  • 当用户访问(运行脚本)到以"Who has access to the app:": Anyone部署的Web Apps时,必须将Web Apps脚本共享给用户。而且,访问令牌是必需的。这是自2018年4月11日起的规范。

目标:

  • 您希望在"Who has access to the app:": Anyone下访问Web应用程序而不共享脚本。

不幸的是,这可以通过规范直接实现。因此,需要考虑一种解决方法。

解决方法:

在上述情况下,当您想让用户访问Web Apps而不共享脚本时,我想提出以下解决方法。

  1. 将Web Apps部署为"Who has access to the app:": Anyone, even anonymous
  2. 当用户访问Web Apps时,用户使用带有查询参数和/或有效负载的密码。

通过上述设置,您可以使用户无需共享脚本即可访问Web Apps。在这种情况下,将使用密码代替访问令牌。

示例脚本:Web Apps端

在此示例中,密码用作查询参数。可以像使用API​​密钥一样使用。

function doPost(e) {
  if (e.parameter.password === "sample") {
    return ContentService.createTextOutput("Done.");
  }
  return ContentService.createTextOutput("Error.");
}

function doGet(e) {
  if (e.parameter.password === "sample") {
    return ContentService.createTextOutput("Done.");
  }
  return ContentService.createTextOutput("Error.");
}

样本卷曲:客户端

curl -L "https://script.google.com/macros/s/###/exec?password=sample"

注意:

  • 当使用上述curl示例访问以上述条件部署的Web Apps时,将从Done.返回doGet()。如果密码错误,则返回Error.。这样,您可以使用户无需共享脚本即可访问Web Apps。
  • 在修改Web Apps脚本时,请以新版本部署Web Apps。这样,就可以反映出最新的脚本。

参考文献: