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