使用服务器密钥时,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 返回“调用者没有权限”的主要内容,如果未能解决你的问题,请参考以下文章