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

Posted

技术标签:

【中文标题】使用服务器密钥时,Google Sheets API 返回“调用者没有权限”【英文标题】:Google Sheets API returns "The caller does not have permission" when using server key 【发布时间】: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"
  

我在这里做错了什么?

【问题讨论】:

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

要解决此问题,请尝试:

    创建服务帐户:https://console.developers.google.com/iam-admin/serviceaccounts/ 在选项中,创建一个密钥:此密钥是您常用的 client_secret.json - 以同样的方式使用它 为服务帐户设置角色所有者(成员名称 = 服务帐户 ID = 服务帐户电子邮件,例如:thomasapp@appname-201813.iam.gserviceaccount.com 复制您的服务帐户的电子邮件地址 = 服务帐户 ID 只需在浏览器中转到您要与之交互的 Google 表格 转到屏幕右上角的 SHARE 转到高级设置并与您的服务帐户的电子邮件地址共享,例如: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 调用进行身份验证即可访问它。

要更改访问权限:

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

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

【讨论】:

以上是关于使用服务器密钥时,Google Sheets API 返回“调用者没有权限”的主要内容,如果未能解决你的问题,请参考以下文章

Google Sheets API v4 接收公共供稿的 HTTP 401 响应

如何从 Windows 服务授权 Google Sheets API

请求时Google Sheets HttpError 403

如何通过服务帐户通过 Google BigQuery External Table 访问 Google Sheets Doc

使用 Google Sheets API 将图像插入 Google Sheets 单元格

如何为 Google App Signing 生成上传密钥?