【问题标题】:How to interact with html response from http request in Flutter如何在 Flutter 中与来自 http 请求的 html 响应进行交互
【发布时间】:2021-01-11 01:16:04
【问题描述】:

我有一个 Flutter 应用程序,我在其中通过 http 请求运行 Google Apps 脚本。该脚本的目的是创建一个表单并将响应链接到传入的电子表格ID。该脚本配置为仅允许 Google 帐户访问它,并且我已将 Flutter 应用程序设置为使用服务帐户来访问使用格式的脚本:

getCredentials().then( (AuthClient client){
    response = client.get(url, headers{"Authorization": "Bearer ${client.access_token}");
});

问题:问题是服务帐户第一次发出请求时会收到 HTML 响应,说明帐户需要授予脚本访问其数据的权限,而我'不知道该怎么做。

我对发出 http 请求并将其与 GoogleAPI 一起使用还很陌生,所以我被困住了。有什么建议吗?

【问题讨论】:

  • 另外,使用自己的凭据创建文档并更改所有权是不好的做法吗?
  • 我不相信您可以通过 Apps Script API ref 使用服务帐户。你能分享更多你的代码吗?您还可以详细说明为什么要为此使用服务帐户吗?没有它们也有办法做到这一点,但也许你有特殊的理由使用它们。另外,电子表格ID是从客户端传入的吗?您的应用程序脚本项目是以任何方式部署的还是您自己运行的?
  • 您不能直接使用 Apps Script API,但您可以向已部署为 WebApp 的 App Script 发出 http 请求(这就是我正在做的事情)。此外,此应用程序旨在成为一个易于使用的应用程序,并且任何拥有 Google 帐户且没有技术背景的人都可以进行设置。从我能找到的只有服务帐户符合我的要求,因为我相信它是唯一的凭据,任何人都可以简单地创建和使用它,而无需任何其他要求,例如验证或域
  • 电子表格ID也以url作为参数传入。顺便说一句,您指的是哪个代码,您是否希望我扩展任何特定的部分?
  • 如果您已将其部署为具有最小权限的 Web 应用程序,那么任何人都可以向它发出请求。您可以从某些客户端 JavaScript 发出请求,而无需任何身份验证。这绕过了对服务帐户的任何需求,除非我遗漏了什么。您的应用程序是数据输入工具吗?在哪种情况下,您需要该应用有权操作他们的电子表格?您可能无法访问的电子表格,对吧?如果是这样,那么他们将需要进行身份验证,这是没有办法的。服务帐户仅在域内真正起作用。

标签: flutter google-apps-script httprequest httpresponse service-accounts


【解决方案1】:

目标

创建一个网页,任何人都可以使用该网页来提交 Google 表格链接,并让应用程序创建一个表格并将表格链接到该表格。

授权

为此,用户需要一个谷歌帐户,并且他们需要通过 OAuth 流程来授权您的应用。

要创建表单并从客户端 JavaScript 链接它,您确实需要调用 Apps Script API,尽管您不能使用服务帐户来执行此操作

发件人:https://developers.google.com/apps-script/api/how-tos/execute

警告:Apps Script API 不适用于服务帐户。

幸运的是,您不需要服务帐户来执行此操作。

说明

  • 使用类似以下的函数创建一个 Apps 脚本项目:

    function createForm(ssID){
      form = FormApp.create("Your New Form");
      form.setDestination(FormApp.DestinationType.SPREADSHEET, ssID);
      let formLink = form.getPublishedUrl();
      return formLink;
    }
    
  • 保存并记下脚本项目的 ID。

  • 设置一个 GCP 项目(听起来您已经有了一个)。

  • 确保在您的 GCP 中启用了 Apps Script API。

  • 配置 OAuth 同意屏幕并添加范围 - https://www.googleapis.com/auth/forms

  • 创建 API 密钥和客户端 ID - 将 http://localhost:8000 或您正在测试的任何端口添加到“授权的 JavaScript 来源”

  • 创建 OAuth 凭据“Web 浏览器 (JavaScript)”。

  • 将您的 Apps 脚本项目链接到同一个 GCP 项目 - Instructions

  • 将 Apps 脚本项目部署为 API 可执行文件 - 不要使用 部署 ID,虽然文档说您需要脚本 ID,但这是错误的,至少对于新的 Apps 脚本 IDE .

  • 在您的应用中编写客户端 JavaScript,就像在 quickstart 中找到的一样。这将使用户能够授权该应用程序。您还需要在那里添加范围和键。我建议您先按照快速入门步骤来感受一下。授权部分无需修改即可使用。

  • 然后添加将调用您的 Apps 脚本的函数,如下所示:

    function appsScriptCreateForm(ssId) {
      var scriptId = "<DEPLOYMENT_ID>";
    
      // Run your Apps Script function
      gapi.client.script.scripts
      .run({
          scriptId: scriptId,
          resource: {
              function: "createForm",
              parameters: [ssId],
          },
      })
      .then(function (resp) {
          var result = resp.result;
    
          // ERROR HANDLING
          if (result.error && result.error.status) {
              appendPre("Error calling API:");
              appendPre(JSON.stringify(result, null, 2));
          } else if (result.error) {
              var error = result.error.details[0];
              appendPre("Script error message: " + error.errorMessage);
              if (error.scriptStackTraceElements) {
                  appendPre("Script error stacktrace:");
                  for (var i = 0; i < error.scriptStackTraceElements.length; i++) {
                      var trace = error.scriptStackTraceElements[i];
                      appendPre("\t" + trace.function + ":" + trace.lineNumber);
                  }
              }
    
          // IF SUCCESSFUL
          } else {
              console.log("success", resp);
          }
      });
    }
    
  • 使用必要的按钮和输入来编写您的 HTML。

  • 在适当的地方添加事件监听器。

  • 利润!

请注意

  • 此设置是您的项目在其他帐户的授权下运行。
  • API 请求计入您的配额。
  • 您可以在 GCP 项目仪表板中查看所有执行的详细信息。
  • 用户需要 Google 帐户并需要对应用进行授权。
  • 在上面的 Apps Script 函数中,您只需要传入电子表格 ID。不是整个链接。您可以要求提供整个链接,然后根据需要使用 Regex 提取 ID。
  • 这可能非常棘手,很容易错过步骤或出错,因此请仔细检查您的工作。
  • 如果授权成功后,在尝试运行脚本时遇到 404 错误,说明请求构建错误,请检查您的 ID。如果您收到 500 错误,这可能意味着 Apps Script 函数已成功调用,但是,有一个错误 在 Apps Script 中并且失败了,请检查执行页面Apps 脚本编辑器。

参考文献

【讨论】:

  • 这个“白名单”从何而来?我在 Auth 屏幕中看不到它
  • 抱歉,它是在您创建客户端 ID 时 - “授权的 JavaScript 起源”
  • 只是为了澄清一下,通过此实现,发出此调用的动态 Google 帐户将是接收此表单并有权访问工作表的人,对吗?就我目前对所有这些部分如何协同工作的理解而言,这个问题的答案并不明显
  • 如果通过接收表格您的意思是表格的所有者,那么是的。工作表是预先创建的,并且您传入工作表文档 ID,因此他们可能是所有者。该应用程序基本上会创建一个表单并将其链接到传入的表单代表正在使用它的帐户。
猜你喜欢
  • 2014-07-24
  • 2021-08-26
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2012-05-25
  • 2016-04-14
相关资源
最近更新 更多