google-apps-script - 如何在不过期的情况下向 Google 应用脚本添加授权?
问题描述
我有一个 Google 应用程序脚本项目,我将其用作Web 应用程序,以将从网页(仅限 JavaScript)收集的一些数据保存到我的Google 工作表中(将其视为仅对我而言的简单数据库)。
除了我的帐户之外,无需对其他任何人使用身份验证,因为我根本不会将他们的帐户/数据用于任何事情。我只需要使用我的帐户,所以,当我部署它时,我让它以我的身份执行,并且任何人都可以访问:
.
当我在上一个屏幕之后单击部署时,它会要求我允许(同意对话框)访问我的帐户数据,我授予它,之后一切都很好,并且对该脚本的 HTTP 请求工作正常。
.
问题是:
此授权在 3-5 天后到期(我不确定)并且脚本停止工作,我发现当对它的 HTTP 请求返回时error 403
为了解决这个问题并让它再次工作,我需要从谷歌应用程序脚本编辑器再次运行脚本,再次请求权限(同意):
.
我不能那样使用它,当授权被撤销时网页停止工作!
我没有发布脚本(我不想/不需要)。我吗?
我的问题是,我怎样才能以一种使其持续存在的方式添加授权并停止一遍又一遍地向我询问?
Google 应用程序脚本上的脚本工作方式如下:
function doPost(request) {
return checkRequest(request);
}
function checkRequest(request) {
//check the request & save the sent data to a google sheet here;
//...
return sendResponse({
success: true,
data: {result: 'Saved the data!' }
});
}
function sendResponse(response) {
return ContentService
.createTextOutput(JSON.stringify(response))
.setMimeType(ContentService.MimeType.JSON);
}
我使用 Ajax HTTP POST 请求从网页调用它,如下所示:
jQuery.ajax({
url: 'https://script.google.com/macros/s/{script-id}/exec',
method: 'POST',
dataType: "json",
data: {key: 'value'},
success: function (response) {
console.log(response);
},
error: function (response) {
console.error(response);
}
});
这是授权过期几天后脚本返回的响应:
解决方案
这已报告给 Google
已经有一份关于谷歌问题跟踪器的报告详细说明了同样的行为:
谷歌似乎确实知道这个问题。从问题跟踪器链接中,给出了响应:
[...] 查看文档,内容如下:
测试用户的授权将从同意之日起 7 天到期。
所以我不确定我们应该期待与这些测试有什么不同。
还重新阅读了这个帖子,在你的第一条评论中你说这会影响已经发布的项目。虽然我知道您通过取消链接 GCP 项目来修复存在问题的原始项目。
一个可能的解决方法是在清单中手动填充这些类型问题的范围。这是因为 Apps 脚本会尝试推断运行时所需的范围,有时这会导致 Apps 脚本尝试获得比授权范围更大的许可范围。
请参阅设置显式范围
但是,对于处于“测试”状态的项目,预计令牌将在 7 天左右到期。
报告线程中的用户似乎就是这种情况。
如使用 OAuth 2.0 访问 Google API 页面中所述,可能会出现这种过期的原因有多种。
话虽如此,如果它引起问题,您可以在 Google Apps 脚本组件中提交您自己的错误。
参考:
推荐阅读
- algorithm - 具有分配的恒定时间复杂度
- javascript - 如何在存在时使用数组值构建消息字符串
- javascript - 如何发布我的 vue npm 库以同时支持 Vue 2 和 Vue 3,
- java - 对我的括号的改进,重新对齐 Java 代码
- bitbucket - 在我的 Maven 包上运行 jgitflow start 时出现异常(org.eclipse.jgit.api.errors.TransportException)
- python - 有没有办法在同一轴上绘制多个累积直方图,其中数据集被标准化
- java - 将 CharArray 中某个字符后的八个字符添加到字符串
- javascript - 在 Node 中调用具有命名空间的 .dll 库的正确方法是什么?
- java - Java 声音采样器未完成获取缓冲区
- javascript - 为什么反应调用api这么多次加载页面?