Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 从Google Apps脚本访问时被Google云数据存储API拒绝的权限_Google Apps Script_Google Cloud Datastore - Fatal编程技术网

Google apps script 从Google Apps脚本访问时被Google云数据存储API拒绝的权限

Google apps script 从Google Apps脚本访问时被Google云数据存储API拒绝的权限,google-apps-script,google-cloud-datastore,Google Apps Script,Google Cloud Datastore,我们已经创建了一个GoogleApps脚本,该脚本应该在Google云数据存储中查找某些记录键,如果它们不存在,则开始事务并提交这些记录 该脚本确实成功地使用了谷歌云项目MYAPP-TEST的服务帐户和数据存储ID,但当我们更改了实际谷歌云项目MYAPP-LIVE的服务帐户和数据存储ID的设置时,只有查找请求成功地使用了预期的响应,但是beginTransaction请求总是导致错误: { "error": { "errors": [ {

我们已经创建了一个GoogleApps脚本,该脚本应该在Google云数据存储中查找某些记录键,如果它们不存在,则开始事务并提交这些记录

该脚本确实成功地使用了谷歌云项目MYAPP-TEST的服务帐户和数据存储ID,但当我们更改了实际谷歌云项目MYAPP-LIVE的服务帐户和数据存储ID的设置时,只有查找请求成功地使用了预期的响应,但是beginTransaction请求总是导致错误:

{
    "error": {
        "errors": [
             {
                  "domain": "global",
                  "reason": "PERMISSION_DENIED",
                  "message": "Unauthorized."
             }
        ],
        "code": 403,
        "message": "Unauthorized."
     }
}
我的问题是,为什么对于一个数据存储(MYAPP-LIVE),一个请求成功,而另一个请求失败,而对于另一个数据存储(MYAPP-TEST),一切(以及更多)都可以完美地工作。我们试图复制这两个数据存储的设置,但可能我们遗漏了一些东西。这就是我们所做的和设置。也许你知道怎样解释脚本的不同行为

MYAPP-LIVE是几年前在旧的应用程序引擎管理页面中创建的,使用自定义域,与我们在Google Apps for Work域中使用的相同。MYAPP-TEST是几周前在新的谷歌云控制台上创建的。两者都有一个数据存储。两个项目的创建方式不同,MYAPP-TEST没有使用自定义域,这应该是我能想到的唯一区别

脚本使用

查找请求发送至:

"https://www.googleapis.com/datastore/v1beta2/datasets/"+datasetId+"/lookup?fields=deferred%2Fpath%2Fname%2Cfound"
"https://www.googleapis.com/datastore/v1beta2/datasets/"+datasetId+"/beginTransaction"
在有效载荷中有一些键,我认为这与此无关

beginTransaction请求被发送到:

"https://www.googleapis.com/datastore/v1beta2/datasets/"+datasetId+"/lookup?fields=deferred%2Fpath%2Fname%2Cfound"
"https://www.googleapis.com/datastore/v1beta2/datasets/"+datasetId+"/beginTransaction"
{payload:{“isolationLevel”:“SNAPSHOT”}
字符串化

这两个请求还使用以下选项:

var options = {
    method: "POST",
    contentType : "application/json" ,
    muteHttpExceptions : true,
    headers: {
        "authorization": "Bearer " + accessToken,
    }
}
两个请求都使用相同的
accessToken
,通过检索该令牌进行身份验证

在MYAPP-LIVE和MYAPP-TEST这两个项目中,我们都创建了服务帐户,并启用了“编辑”角色和“域范围委派”选项。这是在googleclouddeveloper控制台的
Home>权限下完成的

脚本中使用下载的P12 JSON,如下所示:

var keyObj = {
    "type": "service_account",
    "project_id": "MYAPP-TEST",
    "private_key_id": "149b.............3536d",
    "private_key": "-----BEGIN PRIVATE KEY-----\n40c4......be321==\n-----END PRIVATE KEY-----\n",
    "client_email": "srvacct4gas@myapp-test.iam.gserviceaccount.com",
    "client_id": "1033..........6420",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/srvacct4gas%40myapp-test.iam.gserviceaccount.com"
};
P12 JSON已替换为MYAPP-LIVE中服务帐户的JSON

在googleclouddeveloper控制台的
Home>API
下,我们还打开了googleclouddatastoreapi和(不确定是否真的需要)googledriveapi

在Google Apps for Work的管理页面中,我们还添加了MYAPP-LIVE的服务帐户,与我们之前使用MYAPP-TEST的方式相同,即使用从服务帐户复制的客户端ID,范围如下:

此外,我们将Google Apps脚本的开发者控制台项目编号MYAPP-TEST更改为MYAPP-LIVE(在脚本菜单中:
Resources>Developers Console项目…


最后,我还颠倒了请求的顺序,首先是beginTransaction,但它再次失败,并出现相同的错误。

我发现了另一个不同之处,当我更改它时,该脚本也可以与MYAPP-LIVE配合使用。在谷歌云控制台中的
App-Engine>Settings
下有一个选项
application>操作设置>引用者
。在将其更改为
谷歌账户API
后,它被设置为
谷歌应用程序域:MYDOMAIN.COM
(如MYAPP-TEST),脚本现在的行为符合预期。你知道为什么App Engine的身份验证方法只会影响Google Cloud Data Store API的某些请求类型吗?我发现了另一个区别,当我更改它时,脚本也可以与MYAPP-LIVE配合使用。在Google Cloud Console中,在
App Engine>设置下有一个选项n
Application Settings>referers
。它被设置为
Google-Apps-domain:MYDOMAIN.COM
。在将其更改为
Google-Accounts-API
(与MYAPP-TEST中一样)后,脚本现在的行为与预期一致。你知道,为什么App-Engine的身份验证方法只会对Google-Cloud-Datastore API的某些请求类型产生影响吗?