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

Posted

技术标签:

【中文标题】无法使用访问令牌访问部署为网络应用程序的 Google Apps 脚本【英文标题】:Can't access a Google Apps Script deployed as a web app with an access token 【发布时间】:2019-10-15 14:18:38 【问题描述】:

我想进一步了解 Apps Script Web 应用程序在使用 OAuth 访问令牌访问它们时的工作原理。

这是 Apps Script 网络应用:

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


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

它被部署为:我

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

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

我使用 Google OAuth Playground 生成访问令牌

我以我的身份登录:它适用于每个“有权访问应用程序的人”权限,这是我所期望的。 在域中以其他人身份登录:仅适用于“任何人,甚至匿名”权限,并且仅当传入请求没有授权标头时。否则我会收到 403 Forbidden 错误。 我希望它适用于以下权限: '任何人,甚至匿名',即使请求具有授权标头 '任何人' '域内的任何人' 以域外的其他人身份登录:仅适用于“任何人,甚至匿名”权限,并且仅当传入请求没有授权标头时。否则我会收到 403 Forbidden 错误。 我希望它适用于以下权限: '任何人,甚至匿名',即使请求具有授权标头 '任何人'

我错过了什么?

编辑

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

【问题讨论】:

虽然我不确定这是否与您的问题直接相关,但能否请教一下访问令牌中包含的范围? 范围是googleapis.com/auth/drive 感谢您的回复。根据您的回复,我认为范围不是您问题的原因。 你能告诉我们出现403状态码时的错误信息吗? 因此,例如部署应用程序时将 who-can-access 设置为“任何人”,并以域外用户的身份登录,响应是一个 html 页面。标题是“您需要许可”,内容是“想加入?请求访问权限,或切换到具有权限的帐户。了解更多。您以 xxxxx 身份登录,并显示“请求访问”按钮 【参考方案1】:

这个解决方法怎么样?

规格:

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

目标:

您想在"Who has access to the app:": Anyone的条件下访问Web Apps而不共享脚本。

不幸的是,这可以通过规范直接实现。所以需要想办法解决。

解决方法:

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

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

通过以上设置,您可以让用户在不共享脚本的情况下访问 Web Apps。在这种情况下,使用密码而不是访问令牌。

示例脚本:Web 应用端

在此示例中,密码用作查询参数。这可以像使用 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:客户端

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

注意:

当它使用上述 curl 示例访问在上述条件下部署的 Web 应用程序时,Done.doGet() 返回。如果密码错误,则返回Error.。这样,您可以让用户在不共享脚本的情况下访问 Web 应用程序。 当您修改 Web Apps 的脚本时,请将 Web Apps 部署为新版本。这样就可以反映最新的脚本。

参考资料:

Web Apps Taking advantage of Web Apps with Google Apps Script

【讨论】:

以上是关于无法使用访问令牌访问部署为网络应用程序的 Google Apps 脚本的主要内容,如果未能解决你的问题,请参考以下文章

部署 Cloud Functions 后出现错误:无法刷新访问令牌。

Spring oauth2 刷新令牌 - 无法将访问令牌转换为 JSON

Spring oauth2刷新令牌 - 无法将访问令牌转换为JSON

OpenIdDict 多个授权服务器无法解码相同的访问令牌

即使访问令牌有效,也无法使用刷新令牌刷新 Google OAuth2 的访问令牌

Spring - oauth 2 - 无法将访问令牌转换为 JSON