【问题标题】:Accessing Google Sheets file shared with service account yields 403 Forbidden error访问与服务帐户共享的 Google 表格文件会产生 403 禁止错误
【发布时间】:2019-01-04 14:16:06
【问题描述】:

我在使用 Powershell 脚本处理 Google 电子表格时遇到问题。

我创建了一个 Google 表格,创建了一个 Google Cloud 项目,启用了表格和云端硬盘 API,创建了一个服务帐户,并将其添加到 Google 表格(共享)。

已安装谷歌云 SDK:

Install-Module GoogleCloud
gcloud init
gcloud auth activate-service-account --key-file .\Documents-eb5947bf353a.json

但请求值范围会引发“403(禁止)”错误:

$sheetidDocuments = "XXXXXXXXXXXXXXXXXXXXXXXXX"
$rangeDocuments = "Sheet1!XXX:XXX"
$requestUri = "https://sheets.googleapis.com/v4/spreadsheets/$sheetidDocuments/values/$rangeDocuments"
$result = Invoke-RestMethod -Uri $requestUri -Method Get -ContentType "application/json; charset=utf-8"

我不知道为什么。我花了几个小时试图修复它,但没有成功。这是服务帐户的工作方式,还是我必须为此使用带有访问令牌的 OAuth2?
我只想读/写工作表。

使用用户帐户而不是服务帐户的其他项目也可以正常工作。

【问题讨论】:

  • 您如何将访问令牌应用于请求?禁止通常意味着您正在尝试访问需要身份验证的方法,而实际上没有经过身份验证。
  • 嗯,这是我的问题的一部分——我是否也需要使用服务帐户处理访问令牌?我在想我在使用 Oauth2 而不是 json 密钥时只需要访问令牌。如果是这样的话,难怪事情不工作;)
  • 您将始终需要访问令牌来向 API 发出请求。因此,您将不得不弄清楚如何使用 powershell 进行服务帐户身份验证。如果您确实知道如何做到这一点,请回答您的问题,我很乐意看到代码。我从未见过有人能做到这一点。

标签: powershell google-api google-sheets-api service-accounts


【解决方案1】:

正如 DalmTo 在 cmets 中所说,您需要将访问令牌传递给 API。您可以使用命令 gcloud auth print-access-token 从 gcloud CLI 获取有效的访问令牌。

确保在执行实际请求之前获取一个新令牌,因为它们的寿命约为 60m,如果它们不是新鲜的,您可能会收到过期的令牌响应。

$token = gcloud auth print-access-token
$headers = @{'Authorization' = 'Bearer '+$token}

$result = Invoke-RestMethod -Uri $requestUri -Method Get -ContentType "application/json; charset=utf-8" -Headers $headers

如果您不想使用来自 gcloud 的令牌,则必须自己获取令牌,但这需要一些工作。非常详细的解释见HTTP/REST section here

【讨论】:

  • 使用来自gcloud 的令牌将不起作用,因为 SDK 缺少正确的范围。您可以通过运行以下命令进行检查:grep -A 10 SCOPES $(gcloud info --format 'value(installation.sdk_root)')/lib/googlecloudsdk/core/config.py。以下是有关如何在 BASH 上执行此操作的一些说明:stackoverflow.com/a/59162879/1308883
  • 黑客config.py 为我工作。我已经成功地将令牌与github.com/umn-microsoft-automation/UMN-Google 一起使用,而不是内置的Get-GOAuthTokenService,它不能开箱即用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 2019-02-28
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 2017-12-05
相关资源
最近更新 更多