使用服务器密钥时,Google Sheets API返回“调用者没有权限”


89

我已经在API管理器中生成了服务器密钥,并尝试在Mac上执行以下命令:

curl 'https://sheets.googleapis.com/v4/spreadsheets/MySheetID?ranges=A1:B5&key=TheServerKeyIGeneratedInAPIManager'

但这是返回的内容:

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

我在这里做错了什么?


4
密钥用于访问公共数据,您正在执行的操作需要经过身份验证的访问。
DaImTo

在大多数情况下,存在范围问题。请检查并验证脚本需要哪些范围。
dpkrai96

Answers:


119

要解决此问题,请尝试:

  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. 转到屏幕右上方的“分享”
  7. 转到高级设置并与您的服务帐户的电子邮件地址共享,例如:thomasapp@appname-201813.iam.gserviceaccount.com

它对我有用:)


1
这对我有用。顺便说一句:在google cloud admin中,转到...项目> IAM&Admin>服务帐户...。如果已设置服务帐户,则将为每个服务帐户看到一封特殊的电子邮件。确保您还启用了Google Sheets API。从字面上看,您只需通过Google工作表的“共享”按钮共享服务帐户的电子邮件地址即可。
杰森F

1
是的...关键是只与服务帐户电子邮件共享文档
。...– user1102171

2
密钥json与我从Java快速入门指南(用于Sheets API)获得的凭据json完全不同。如何实施?
红衣主教-恢复莫妮卡

2
您如何使用客户机密?您可以改为使用服务帐户创建API密钥吗?
Stephen Phillips

42

我知道现在回答有点晚了,但是对于其他在同一问题上苦苦挣扎的人来说。
只需将工作表的权限更改为对驱动器公开,以便无需通过API调用进行身份验证即可对其进行访问。

更改访问权限:

  1. 在Google云端硬盘中打开表格
  2. 点击右上角的共享
  3. 在提示窗口的底部,单击“高级”。
  4. 将权限更改为公开或具有链接的人(无需登录)

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

注意:如果工作表中包含敏感数据,则将其公开,而是通过身份验证访问来进行是不安全的。


36
另外,您可以与特定的电子邮件Ex分享此表。您的服务帐户(项目)电子邮件。“ client_email”:“ XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com”,这将允许您通过脚本访问工作表。
Kishan Patel

4
多谢兄弟。文档中没有像您提到的那样书面的东西。
Maulik Dodia

1
同意@MaulikDodia。Google API文档在这里说了这一点,但对于只想使用该API在公共网站上显示数据的人来说,目前尚不清楚。我正在编写有关所有内容的操作方法。完成后,我会寄给您一份DM。
爱德华

非常感谢friend @ user3411192
Maulik Dodia

27

确保注意@KishanPatel的评论:

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


4

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

安装gcloud

sudo apt-get install google-cloud-sdk

然后打电话

gcloud init

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

gcloud config configurations list

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

gcloud auth list
* account 1
  account 2

如果没有,请更改为该项目的帐户:

gcloud config set account `ACCOUNT`

根据帐户的不同,项目列表将有所不同:

gcloud projects list

- project 1
- project 2...

切换到预期的项目:

gcloud config set project `PROJECT NAME`

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


0

我的10美分...一个简单的示例,使用Java来阅读工作表。

    private Credential getCredentials() throws IOException {
            final InputStream accessKey = new ByteArrayInputStream("<credential json>");
            final GoogleCredential credential = GoogleCredential.fromStream(accessKey)
                    .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS_READONLY));
            return credential;
        }

    private HttpTransport httpTransport() {
            try {
                return GoogleNetHttpTransport.newTrustedTransport();
            } catch (GeneralSecurityException | IOException e) {
                throw new SpreadSheetServiceException(e);
            }
        }


    Sheets service = new Sheets.Builder(httpTransport(), JSON_FACTORY, getCredentials())
                    .setApplicationName("app-name")
                    .build();
            ValueRange response = service.spreadsheets().values()
                    .get("<spread_sheet_id>", "A1:A")
                    .execute();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.