首页 > 解决方案 > GCP App Script API Auth 仅对两个用户不起作用(代码:403,“PERMISSION_DENIED”)

问题描述

我通过 Google Cloud Platform 将基于 Google Apps 脚本的软件部署给多个用户。其中大部分是通过每 x 分钟运行一次的触发器来工作的。但是,目前有一个脚本通过 Apps Script API 调用来运行。

我昨天做了一些改变。请参阅我能够回答的 Stack Overflow 问题:Google Apps Script API Authorizations for DriveApp.getFileById。(这是通过 API 调用的第二个脚本,但尚未部署太多。)

这可能“破坏”了只有两个最近加入的用户(最后两个是几天前加入的)通过 Apps Script API 调用脚本的能力。其他用户很好。我已经比较了所有用户在客户端的所有内容,并且所有用户似乎都完全相同。

以下是调用 Apps Script API 的客户端(在 runOnEdit 中)的代码:

var token = ScriptApp.getOAuthToken();
var header = {
  "Content-Type": "application/json",
  "Authorization": "Bearer " + token,
};

var parms = [id];

var data = {
  "function": "checkSheet",
  "parameters": parms,
  "devMode": false,
}

var options = {
  "method":"POST",
  "headers": header,
  "muteHttpExceptions": true,
  "payload": JSON.stringify(data)
};

var response = UrlFetchApp.fetch(url, options);

对于 manifest / appsscript.json 文件,我有:

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "webapp": {
    "access": "MYSELF",
    "executeAs": "USER_DEPLOYING"
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/script.external_request"
    ]
}

oauthScopes 部分是昨天刚刚为所有用户添加的(一个工作的,一个不工作的)——上面提到的我的 Stack Overflow 问题的答案。我还尝试为受影响的两个用户添加许多不同的 oauthScope,但没有帮助。

对于所有仍在工作的用户,在他们的客户端(上面的代码所在的位置),他们的 GCP 项目中没有启用的 API。看到这张图片:[![在此处输入图片描述][1]][1]

他们的 OAuth 同意屏幕只是默认设置 - 类型:公共、默认范围等。

然而,今天早上对于没有工作的 2 个用户,当上面的代码运行并调用 Apps Script API 脚本时,响应是:

response = {
  "error": {
    "code": 403,
    "message": "Apps Script API has not been used in project 746982115040 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/script.googleapis.com/overview?project=746982115040 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.",
    "status": "PERMISSION_DENIED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.Help",
        "links": [
          {
            "description": "Google developers console API activation",
            "url": "https://console.developers.google.com/apis/api/script.googleapis.com/overview?project=746982115040"
          }
        ]
      },
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "SERVICE_DISABLED",
        "domain": "googleapis.com",
        "metadata": {
          "consumer": "projects/746982115040",
          "service": "script.googleapis.com"
        }
      }
    ]
  }
}

但是,这与正在工作的用户没有什么不同——他们没有启用 Apps Script API。

因此,我为发生这种情况的两个用户之一启用了 Apps Script API。现在,在这样做之后,我收到以下消息:

response = {
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}

任何帮助是极大的赞赏!谢谢!

标签: google-apps-scriptgoogle-cloud-platformhttp-status-code-403google-apps-script-api

解决方案


首先,我不得不说,学习 GCP 和它周围的所有授权是很困难的。有很多事情可能是导致此类问题的原因。

就我而言,最终“客户的”应用脚本项目仍然是“应用脚本管理的云平台项目”,而不是与 API 关联的常规 GCP 项目。

要解决此问题,请在用于进行 API 调用的脚本的 Google Apps 脚本代码编辑器中,转到菜单/资源/云平台项目。 在此处输入图像描述

找到您要与之关联的 GCP 项目编号 - 在我的情况下,它是“服务器的”项目编号,我从中部署了 API。

单击“设置项目”按钮。

现在我的 API 调用工作了!


推荐阅读