当使用服务器密钥时,GoogleSheetsAPI 返回“调用者没有权限”

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

我做错了什么?

142761 次浏览

我知道现在回答这个问题有点晚了,但对于其他正在为同样的问题苦苦挣扎的人来说。
只有 更改对公众的许可在您的驱动器,所以它可以访问没有通过 API 调用的身份验证。

更改访问权限:

  1. 在谷歌硬盘打开表
  2. 在右上角,单击“共享”
  3. 在提示窗口的底部,单击“高级”
  4. 将权限更改为带有链接的公共或用户(不需要登录)

发送 API 请求以便在没有身份验证的情况下从表中获取数据。

注意: 如果该表包含敏感数据,那么将其公开是不安全的,而是使用身份验证访问。

要解决这个问题,请尝试:

  1. 创建一个服务帐户: https://console.developers.google.com/iam-admin/serviceaccounts/
  2. 在选项中,创建一个密钥: 这个密钥是您通常使用的 client _ secret. json-使用它的方式相同
  3. 创建服务帐户的角色所有者(成员名 = 服务帐户 ID = 服务帐户电子邮件 ex: thomasapp@appname- 201813.iam.gserviceaccount.com
  4. 复制您的服务帐户的电子邮件地址 = 服务帐户 ID
  5. 只需在浏览器中找到您想要与之交互的 Google 工作表即可
  6. 转到屏幕右上角的 SHARE
  7. 进入高级设置,并与你的服务帐户的电子邮件地址分享,例如: thomasapp@appname- 201813.iam.gserviceaccount.com

请注意@KishanPatel 的评论:

此外,您可以与特定的电子邮件 Ex.your 服务共享此表 帐户(项目)电子邮件“ client _ email”: “ XXXXX@北方 gasket-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美分... 一个简单的例子来阅读表使用 爪哇咖啡

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

对我来说,解决这个问题变得微不足道,你只需要:

  1. 输入我们要远程编辑的谷歌工作表。
  2. 在右上角,set-任何拥有链接的人都可以进入
  3. 最重要的是-在右边,你需要为那些拥有“编辑器”链接的人设置权限

如果你仍然没有得到许可,这意味着你必须去网站: Https://console.developers.google.com/iam-admin/iam/ 然后选择您的项目,然后选择“服务帐户”,并为项目创建一个新帐户作为角色“所有者”或“编辑器”(或使用已经存在的帐户并单击“创建新密钥”)

“ key”是一个 json 文件,当您创建帐户时(或者在那里使用“ create new key”)将下载该文件。

答案的视觉简化:

选项1 -将文件公开(如果工作表包含敏感数据) enter image description here

选项2 -与服务帐户共用档案电邮(IAM & Admin-> 服务帐户-> 详情-> 电邮)

enter image description here enter image description here