Google表格API返回"来电者没有权限"使用服务器密钥时

时间:2016-08-15 04:27:16

标签: 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",
    "status": "PERMISSION_DENIED"
  }
}

我在这里做错了什么?

5 个答案:

答案 0 :(得分:30)

要解决此问题,请尝试:

  1. 创建服务帐户:https://console.developers.google.com/iam-admin/serviceaccounts/
  2. 在选项中,创建一个键:这个键是你常用的client_secret.json - 以同样的方式使用
  3. 为此服务帐户添加所有者权限(会员名称=服务帐户ID =服务帐户电子邮件地址:thomasapp@appname-201813.iam.gserviceaccount.com
  4. 复制服务帐户的电子邮件地址=服务帐户ID
  5. 只需在浏览器中找到您要与之互动的Google表格
  6. 即可
  7. 转到屏幕右上方的SHARE
  8. 转到高级设置并与您的服务帐户的电子邮件地址分享,例如:thomasapp@appname-201813.iam.gserviceaccount.com
  9. 它对我有用:)

答案 1 :(得分:29)

我知道回答有点迟,但对其他人也在苦苦思索同样的问题 只需将您对工作表的权限更改为公开,即可通过API调用进行身份验证。

更改访问权限:

  1. 在Google云端硬盘中打开工作表
  2. 点击右上角,点击分享
  3. 在提示窗口底部,点击高级
  4. 更改对公众或有链接的人的许可(无需签名)
  5. 发送API请求以从工作表中获取数据而无需身份验证。

    注意:如果工作表包含敏感数据,则将其公开并且使用经过身份验证的访问权限进行操作是不安全的。

答案 2 :(得分:13)

请务必注意@ KishanPatel的评论:

  

此外,您可以使用特定的电子邮件Ex分享此工作表。你的服务   帐户(项目)电子邮件。 " client_email&#34 ;:   " XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com" ;,这将允许   通过脚本访问工作表。

答案 3 :(得分:2)

最简单的方法是使用gcloud cli进行修复。 https://cloud.google.com/pubsub/docs/quickstart-cli#before-you-begin

上的更多文档

在可以使用此工具时,请致电

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将自动检测到此类凭据。

答案 4 :(得分:0)

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