【问题标题】:How to trigger a Web App from another script?如何从另一个脚本触发 Web App?
【发布时间】:2020-10-12 12:09:41
【问题描述】:

我部署了一个 Google Apps Script Web App,它使用服务帐户访问 Google Directory。我将它部署为每个人都可以访问该应用程序,并且该应用程序在执行它的用户下运行。

我想通过从属于 Google 表单一部分的另一个应用脚本调用 POST 触发器来触发这个网络应用。像这样的:

function onPost(){
var data = {
'name': 'Bob Smith',
'age': 35,
'pets': ['fido', 'fluffy']
};
var options = {
 'method' : 'post',
 'contentType': 'application/json',.
 'payload' : JSON.stringify(data)
};
var resp = UrlFetchApp.fetch('https://script.google.com/a/my.domain.com/m.../exec', options);

}

但是,我回来了:

异常:https://script.google.com 的请求失败,返回代码 401。

当我尝试使用带有一些查询参数的 GET 触发器时,返回的响应看起来像一个 google 登录页面。

如何从同一个域中的另一个应用脚本触发我的网络应用?


使用令牌更新代码:

function onPost(){
var token = ScriptApp.getOAuthToken();
var data = {
'name': 'Bob Smith',
'age': 35,
'pets': ['fido', 'fluffy']
};
var options = {
 'headers':'Bearer '+token,
 'method' : 'post',
 'contentType': 'application/json',.
 'payload' : JSON.stringify(data)
};
var resp = UrlFetchApp.fetch('https://script.google.com/a/my.domain.com/m.../exec', options);

}

【问题讨论】:

  • Doman 在这里无关紧要 - 因为401 是一个“未经授权的”错误,所以您必须授权请求。只有当您部署为“我”和“任何人,甚至匿名”时,您才会获得公共 API。但是,如果您希望脚本在用户权限下运行,则需要对其进行授权。您可以使用getOAuthToken() 获取不记名令牌,顺便说一句。这意味着您的用户必须授予您的第一个应用程序权限才能代表他们执行人员(必须足以在 Web 应用程序中运行服务)

标签: google-apps-script web-applications triggers urlfetch


【解决方案1】:

返回的响应看起来像一个 Google 登录页面

这是因为您收到了401 Unauthorized HTTP 状态代码,提示您请求应包含有效的用户凭据。由于 Google 主要使用 OAuth 2.0,因此您需要将 Authorization 标头设置为 Bearer YourTokenHere

最近,可以通过getOAuthToken() 获取 OAuth 令牌,该令牌将在其有效负载中包含一个声明,该声明将匹配授予发出请求的应用程序的 scopes(自动或显式)。

如果您需要对令牌管理进行更细粒度的控制,也可以使用官方的OAuth 2.0 library,或者如果您愿意,也可以从头开始构建,Utilities 类拥有生成自定义 JWT 所需的一切。

我将它部署为每个人都可以访问该应用程序,并且该应用程序在执行它的用户下运行

Web 应用在两个权限设置中拥有多个 deployment modes

  1. “将应用程序执行为”
    • 访问网络应用的用户
  2. “谁有权访问应用程序”
    • 只有我自己
    • 任何人
    • 任何人,甚至是匿名的

Google 不会让您仅仅剥夺安全性并公开一个公共 API(这是一件好事),所以如果您希望每个人都能够未经授权访问您的 Web 应用程序,您必须自己授权脚本并让您的用户在您的授权下访问该应用程序。

只有一种选项组合允许您这样做:

以我的身份执行,访问任何人,甚至匿名

【讨论】:

  • 谢谢,我现在按照您的描述添加不记名令牌,但我仍然得到 401。这可能是因为我是从项目 IDE 运行它吗?现在请求中有一个令牌,我实际上正在使用管理员帐户进行调试。我现在将使用令牌编辑我的问题
  • @zlZimon - 这不是它的工作原理:) headers 应该是一个对象,它是一组键值对(在你的情况下,你只需要 Authorization 标题 - { Authorization : "..." })。至于问题——我会更新的,请不要在以后覆盖原来的问题,好吗?
猜你喜欢
  • 2016-05-23
  • 2019-01-31
  • 2019-06-02
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 2014-03-09
  • 2023-02-08
  • 1970-01-01
相关资源
最近更新 更多