如何从 Google OAuth 2.0 Playground 运行 Google App Script 功能 |调用者没有权限

Posted

技术标签:

【中文标题】如何从 Google OAuth 2.0 Playground 运行 Google App Script 功能 |调用者没有权限【英文标题】:How to run Google App Script function from Google OAuth 2.0 Playground | The caller does not have permission 【发布时间】:2019-03-31 07:21:12 【问题描述】:

我创建了一个新脚本,用于在我的 Google 帐户上创建“Google 表单”。以下是示例代码:

function myFunction() 
var form = FormApp.create('New Form');
var item = form.addCheckboxItem();
item.setTitle('What condiments would you like on your hot dog?');
item.setChoices([
  item.createChoice('Ketchup'),
  item.createChoice('Mustard'),
  item.createChoice('Relish')
]);
form.addMultipleChoiceItem()
.setTitle('Do you prefer cats or dogs?')
.setChoiceValues(['Cats','Dogs'])
.showOtherOption(true);
form.addPageBreakItem()
.setTitle('Getting to know you');
form.addDateItem()
.setTitle('When were you born?');
form.addGridItem()
.setTitle('Rate your interests')
.setRows(['Cars', 'Computers', 'Celebrities'])
.setColumns(['Boring', 'So-so', 'Interesting']);

Logger.log('Published URL: ' + form.getPublishedUrl());
Logger.log('Editor URL: ' + form.getEditUrl());

接下来,通过转到 Publish > Deploy as API Executable 使 API Executable

现在,如果我直接从 Google 应用脚本执行代码,它工作得非常好,并且表单也正在创建中。

现在我在执行来自 Google OAuth 2.0 Playground 的代码时遇到了问题。为此,我遵循了以下步骤:

    访问https://console.developers.google.com并创建一个新项目 在左侧菜单中,选择“库”

    在 App Script Library 中,搜索“Apps Script API”并启用它

    接下来,转到凭据菜单并单击“创建凭据”> OAuth 客户端 ID

    在下一个屏幕上,选择 Web 应用程序

    输入新 Web 应用程序的名称

    在“授权的 javascript 来源”中设置“http://localhost”

    在“授权重定向 URI”中设置“https://developers.google.com/oauthplayground”,因为目前我们将要求 Google OAuth Playground 上的身份验证响应。然后点击创建。

    成功后,您将收到您将在 Google OAuth Playground 中提供的帐户的“客户端 ID”和“客户端密码”,以对其他用户应用程序进行身份验证。

    现在访问https://developers.google.com/oauthplayground 并单击设置齿轮。在下拉菜单中,选中“使用您自己的 OAuth 凭据”并输入在步骤 9 中收到的“OAuth 客户端 ID”和“OAuth 客户端密码”

    接下来,在“步骤 1 选择和授权 API”部分中,选择“Apps Script API v1”并进一步选择“https://www.googleapis.com/auth/forms”选项并单击授权

    接下来它将询问您要访问所选范围的帐户的授权。在此,我使用创建用于创建代码的“App Script”的同一帐户,以及生成“Client ID”和“Client Secret”的相同帐户。

    上述步骤将生成“授权码”,进一步您可以生成“刷新令牌”和“访问令牌”。

    接下来,我们必须使用服务来执行 google app 脚本代码。单击“列出可能的操作”,然后选择“运行脚本”

      接下来将生成一个语法,询问您可以从 google 应用脚本项目中找到的脚本 ID。为此,在 google App Script 项目上,单击 File > Project Properties,最后将打开一个弹出窗口,引用脚本 ID

    在 PlayGround 中输入脚本 ID,然后通过单击“输入请求正文”按钮设置请求正文。了解请求体参数,参考文档https://developers.google.com/apps-script/api/reference/rest/v1/scripts/run

    现在点击“发送请求”

在完成上述所有步骤后,我们收到以下身份验证错误:

POST /v1/scripts/ScriptId:run HTTP/1.1
Host: script.googleapis.com
Content-length: 95
Content-type: application/json
Authorization: Bearer your authentication

  "function": "myFunction",
  "parameters": [],
  "sessionState": "Test",
  "devMode": true

HTTP/1.1 403 Forbidden
Content-length: 126
X-xss-protection: 1; mode=block
X-content-type-options: nosniff
Transfer-encoding: chunked
Vary: Origin, X-Origin, Referer
Server: ESF
-content-encoding: gzip
Cache-control: private
Date: Fri, 26 Oct 2018 13:44:57 GMT
X-frame-options: SAMEORIGIN
Alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"
Content-type: application/json; charset=UTF-8

  "error": 
    "status": "PERMISSION_DENIED", 
    "message": "The caller does not have permission", 
    "code": 403
  

提前感谢您的解决方案。

【问题讨论】:

您是否已将项目部署为 API 可执行文件? 脚本项目需要获取客户端ID和客户端Secret。在你的问题上,你说1. Visit https://console.developers.google.com and create a new project。在这种情况下,我担心您的脚本项目可能与创建的项目不同。那你能确认一下吗? 如果不同,请为脚本项目执行“创建凭据”。在使用myFunction() 打开脚本的脚本编辑器中,请打开 API 控制台,如资源 -> 可以平台项目 -> 查看 API 控制台,然后执行“创建凭据”并检索客户端 ID 和客户端密码。然后,再次从10. Now visit https://developers.google.com/oauthplayground and click on the Settings Gear. 尝试。如果这不是您问题的直接解决方案,我很抱歉。 @Kamal 你可以从脚本编辑器访问它,正如 Tanaike 在他最后的评论中所说的那样。 @Kamaldeep Singh 很高兴您的问题得到了解决。 【参考方案1】:

要解决此问题,您需要创建在 App Script 中创建的项目的凭据,而不是在 Google 控制台中创建新项目。因此,请跳过问题中提到的第 1 步:

    访问https://console.developers.google.com并创建一个新项目

然后打开 App Script 项目。在当前案例中,项目是“Test Google Form API Personal”

接下来,通过单击三点选项菜单将项目打开为“Cloud Project”,然后选择“Cloud Project”

现在 Google 控制台屏幕将打开。创建已打开项目的 OAuth 凭据。

【讨论】:

以上是关于如何从 Google OAuth 2.0 Playground 运行 Google App Script 功能 |调用者没有权限的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OAuth 2.0 从 Indy 发送 Gmail?

如何使用 OAuth 2.0 从 Indy 发送 Gmail?

从 Google OAuth 2.0 PHP API 获取用户信息

使用 Google Drive Oauth 2.0 管理访问令牌

Google Play 游戏服务测试 - OAuth 失败?

如何在弹出窗口中通过 OAuth 2.0 向 Google 进行身份验证?