【问题标题】:Google Sheets API returns "The caller does not have permission" when using server key使用服务器密钥时,Google Sheets API 返回“调用者没有权限”
【发布时间】:2016-12-21 07:38:50
【问题描述】:

我在 API Manager 中生成了一个服务器密钥,并尝试在我的 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"
  }
}

我在这里做错了什么?

【问题讨论】:

  • 密钥用于访问公共数据,您所做的需要经过身份验证的访问。
  • 在大多数情况下,存在一些范围问题。请检查并验证脚本需要哪些范围。
  • 还要确保您的共享设置设置为“知道链接的任何人都可以查看” - 如果没有此链接,我的就无法使用(即使它已发布到网络上)。

标签: google-api google-sheets google-sheets-api


【解决方案1】:

要解决此问题,请尝试:

  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

【讨论】:

  • 这对我有用。顺便说一句:在谷歌云管理中转到...项目> IAM & Admin > Service Accounts...。如果您设置了服务帐户,您将看到每个相应服务帐户的特殊电子邮件。确保您还启用了 Google Sheets API。从字面上看,您只需通过 google 表格“共享”按钮共享服务帐户电子邮件地址。
  • yes ...关键是仅与服务帐户电子邮件共享文档...。
  • 密钥 json 与我从 Java 快速入门指南(针对 Sheets API)获得的凭证 json 非常不同。如何实施?
  • 如何使用客户端密码?您可以使用服务帐户创建 API 密钥吗?
  • 嗨。如果我不想使用“分享”功能怎么办。我想使用 oauth 2.0 获取/更新任何用户文件。不应该要求用户知道我的客户服务帐户来让我访问他的文件。我怎样才能做到这一点?
【解决方案2】:

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

要更改访问权限:

  1. 在 Google Drive 中打开工作表
  2. 点击右上角分享
  3. 在提示窗口底部,点击高级
  4. 通过链接更改公众或人员的权限(无需登录)

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

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

【讨论】:

  • 此外,您可以与特定电子邮件共享此工作表 Ex。您的服务帐户(项目)电子邮件。 "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", 这将允许您的脚本访问工作表。
  • 谢谢兄弟。文档中没有像您提到的那样的书面内容。
  • 同意@MaulikDodia。 Google API 文档说here,但对于只想使用 API 在公共网站上显示数据的人来说并不清楚。我正在写一个关于这一切的方法。完成后我会发给你一个 DM。
  • 非常感谢朋友@user3411192
【解决方案3】:

请务必关注@KishanPatel 的评论:

此外,您可以与特定的电子邮件 Ex. 共享此工作表。你的服务 帐户(项目)电子邮件。 “客户电子邮件”: “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 会自动检测此类凭据。

    【讨论】:

      【解决方案5】:

      我的 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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-13
        • 2021-04-19
        • 1970-01-01
        • 2017-11-17
        • 1970-01-01
        • 2020-02-22
        • 2020-10-26
        相关资源
        最近更新 更多