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

Google api Google Sheets API返回“;调用者没有权限“;使用服务器密钥时,google-api,google-sheets,google-sheets-api,Google Api,Google Sheets,Google Sheets Api,我已在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",

我已在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"
  }
}

我在这里做错了什么?

我知道现在回答有点晚,但对于其他正在同一问题上苦苦挣扎的人来说。
只需在驱动器上将工作表的权限更改为public,这样就可以通过API调用在无需身份验证的情况下访问该工作表

要更改访问权限,请执行以下操作:

  • 在google drive中打开工作表
  • 在右上角,单击“共享”
  • 在提示窗口的底部,单击“高级”
  • 将权限更改为public或具有链接的人员(无需登录)
  • 发送API请求以从工作表中获取数据,无需验证


    注意:如果该工作表包含敏感数据,那么公开该工作表并不安全,而是使用经过身份验证的访问权限

    要解决此问题,请尝试:

  • 创建服务帐户:
  • 在选项中,创建一个密钥:该密钥是您的常用客户机_secret.json-使用方法相同
  • 为服务帐户设置角色所有者(成员名称=服务帐户ID=服务帐户电子邮件ex:thomasapp@appname-201813.iam.gserviceaccount.com
  • 复制您的服务帐户的电子邮件地址=服务帐户ID
  • 只需在浏览器中转到要与之交互的Google工作表即可
  • 转到屏幕右上角的“共享”
  • 转到“高级设置”并与您的服务帐户的电子邮件地址共享,例如:thomasapp@appname-201813.iam.gserviceaccount.com

  • 请务必注意@KishanPatel的评论:


    此外,您还可以将此表与特定电子邮件(例如您的服务)共享 账户(项目)电子邮件。“客户电子邮件”: "XXXXX@northern-垫圈XXXX.iam.gserviceaccount.com”,这将允许 通过脚本访问工作表


    最简单的方法是使用gcloud cli进行修复

    安装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将自动检测此类凭据。
    我的10美分…一个使用Java阅读工作表的简单示例

    private-Credential getCredentials()引发IOException{
    最终InputStream accessKey=new ByteArrayInputStream(“”);
    最终GoogleCredential凭证=GoogleCredential.fromStream(accessKey)
    .createScope(Collections.singleton(SheetsScopes.SPREADSHEETS_READONLY));
    返回凭证;
    }
    私有HttpTransport HttpTransport(){
    试一试{
    return GoogleNetHttpTransport.newTrustedTransport();
    }捕获(一般安全性异常| IOE异常){
    抛出新的电子表格服务异常(e);
    }
    }
    Sheets服务=new Sheets.Builder(httpTransport(),JSON\u工厂,getCredentials())
    .setApplicationName(“应用程序名称”)
    .build();
    ValueRange响应=service.spreadsheets().values()
    .get(“,“A1:A”)
    .execute();
    
    密钥用于访问公共数据,您正在执行的操作需要经过身份验证的访问。在大多数情况下,作用域存在一些问题。请检查并验证脚本需要哪些作用域。此外,您还可以与特定的电子邮件共享此表,例如您的服务帐户(项目)电子邮件。“客户端电子邮件”:"XXXXX@northern-垫圈-XXXX.iam.gserviceaccount.com",这将允许通过您的脚本访问工作表。谢谢兄弟。文档中没有您提到的书面内容。同意@MaulikDodia。Google API文档会这么说,但对于只想使用API在公共网站上显示数据的人来说还不清楚。我正在编写所有这些的操作方法。我将向您发送一份等我做完了就可以了。非常感谢friend@user3411192this为我工作。顺便说一下:在google cloud admin中,转到…项目>IAM&admin>服务帐户…如果您设置了服务帐户,您将看到每个服务帐户的一封特殊电子邮件。确保您还启用了google Sheets API。实际上,您只需共享服务帐户从google sheet“share”按钮下载电子邮件地址。是的……关键是只与服务帐户电子邮件共享文档……关键json与我从Java quickstart guide(用于Sheets API)获得的凭据json非常不同。我如何实现它?您如何使用客户端密码?您可以使用服务帐户生成API密钥吗?您好。如果我不想使用“共享”功能,该怎么办?我想使用oauth 2.0获取/更新任何用户文件。用户不必知道我的客户端服务帐户,就可以让我访问他的文件。我如何实现这一点?