无法使用访问令牌访问部署为网络应用程序的 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