使用服务器密钥时,Google表格API会返回"来电者没有权限"

Ins*_*ite 47 google-api google-sheets google-sheets-api

我在API Manager中生成了一个服务器密钥,并试图在我的Mac上执行以下操作:

curl 'https://sheets.googleapis.com/v4/spreadsheets/MySheetID?ranges=A1:B5&key=TheServerKeyIGeneratedInAPIManager'
Run Code Online (Sandbox Code Playgroud)

但这就是它的回报:

{
 "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

Tho*_*uin 63

要解决此问题,请尝试:

  1. 创建服务帐户:https://console.developers.google.com/iam-admin/serviceaccounts/
  2. 在选项中,创建一个键:这个键是你通常的client_secret.json - 以同样的方式使用它
  3. 添加此服务帐户的所有者权限(会员名称=服务帐户ID =服务帐户电子邮件地址:thomasapp@appname-201813.iam.gserviceaccount.com
  4. 复制服务帐户的电子邮件地址=服务帐户ID
  5. 只需在浏览器中找到您要与之互动的Google表格即可
  6. 转到屏幕右上角的SHARE
  7. 转到高级设置并与您的服务帐户的电子邮件地址共享,例如:thomasapp@appname-201813.iam.gserviceaccount.com

它对我有用:)

  • 是的...关键是仅与服务帐户电子邮件共享文档... (4认同)
  • 你好。如果我不想使用“共享”功能怎么办?我想使用 oauth 2.0 获取/更新任何用户文件。不应要求用户知道我的客户服务帐户才能让我访问他的文件。我怎样才能做到这一点? (4认同)
  • 密钥 json 与我从 Java 快速入门指南(针对 Sheets API)获得的凭据 json 非常不同。我该如何实施? (3认同)
  • 您如何使用客户端机密?您可以使用服务帐户制作 API 密钥吗? (3认同)
  • 这对我有用。顺便说一句:在谷歌云管理中转到...项目> IAM和管理>服务帐户...如果您已经设置了服务帐户,您将看到每个相应服务帐户的特殊电子邮件。确保您还启用了 Google Sheets API。从字面上看,您只需通过 Google Sheet“共享”按钮共享服务帐户电子邮件地址即可。 (2认同)

WLa*_*tif 32

我知道回答有点晚,但是其他人也在努力解决同样的问题.
只需将工作表的权限更改为驱动器上的公共权限,即可通过API调用进行访问而无需身份验证.

要更改访问权限:

  1. 在谷歌驱动器中打开工作表
  2. 在右上角,单击"共享"
  3. 在提示窗口的底部,单击"高级"
  4. 更改对公众或有链接的人的许可(无需签名)

发送API请求以从工作表中获取数据而无需身份验证

注意:如果工作表包含敏感数据,则将其公开并且使用经过身份验证的访问权限进行操作是不安全的.

  • 此外,您可以使用特定的电子邮件Ex分享此工作表.您的服务帐户(项目)电子邮件."client_email":"XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com",这将允许您的脚本访问工作表. (29认同)
  • 多谢兄弟.你提到的文档中没有书面的东西. (4认同)

Ema*_*uel 29

答案的视觉简化:

选项 1 - 将文件公开(如果工作表不包含敏感数据) 在此输入图像描述

选项 2 - 使用服务帐户电子邮件共享文件(IAM 和管理 -> 服务帐户 -> 详细信息 -> 电子邮件)

在此输入图像描述 在此输入图像描述

  • 我已经尝试解决这个问题几个小时了,你的可视化屏幕截图给了我很大帮助。谢谢你! (2认同)

Hor*_*ren 21

一定要注意@KishanPatel的评论:

此外,您可以使用特定的电子邮件Ex分享此工作表.您的服务帐户(项目)电子邮件."client_email":"XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com",这将允许您的脚本访问工作表.


Yul*_*mok 6

最简单的方法是使用 gcloud cli 进行修复。更多文档在这里https://cloud.google.com/pubsub/docs/quickstart-cli#before-you-begin

安装 gcloud

sudo apt-get install google-cloud-sdk
Run Code Online (Sandbox Code Playgroud)

然后打电话

gcloud init
Run Code Online (Sandbox Code Playgroud)

然后检查您的活动项目和凭据

gcloud config configurations list
Run Code Online (Sandbox Code Playgroud)

如果不行,请确保您使用正确的帐户进行身份验证:

gcloud auth list
* account 1
  account 2
Run Code Online (Sandbox Code Playgroud)

如果不是,请更改为项目的帐户:

gcloud config set account `ACCOUNT`
Run Code Online (Sandbox Code Playgroud)

根据账户的不同,项目列表会有所不同:

gcloud projects list

- project 1
- project 2...
Run Code Online (Sandbox Code Playgroud)

切换到想要的项目:

gcloud config set project `PROJECT NAME`
Run Code Online (Sandbox Code Playgroud)

然后使用 创建应用程序默认凭据gcloud auth application-default login,然后 google-cloud 将自动检测此类凭据。