首页 > 解决方案 > Google Sheet API - 具有域范围委派的服务帐户 - 请求缺少有效的 API 密钥

问题描述

我在 Node.js 上使用 GAPI 库 v75。

我正在使用服务帐户和域范围的委派成功调用 Google Classroom API,以便在用户的上下文中进行更改。

我现在需要访问 Google 表格,因此已激活表格 API 并在管理控制台中授权了所需的范围。这是代码:

  const sheets = google.sheets({version: 'v4', jwtObject});
        sheets.spreadsheets.get({spreadsheetId : thisSheetId}, function(err, returnValue) {
            if (err)  {
                res.json(err)
            } else {
                res.json(returnValue.data)
            }
        }); 

JWT 通过以下方式生成:

 var jwtClient = new google.auth.JWT(
         client_email,
         null,
         private_key,
         scopes,
         emailToImpersonate
  );

jwtClient.authorize(function (err, tokens) {
  if (err) {
      console.error('Unable to authenticate with google:', err);

      return
  }

  callback(err, jwtClient)

我生成 JWT 的方式与为课堂 API 和 Admin SDK 生成的方式完全相同,它们都可以正常工作。但对于工作表 API,我收到:

"code":403,"errors":[{"message":"The request is missing a valid API key.","domain":"global","reason":"forbidden"}]

我不明白为什么如果我传递了一个有效的 JWT,为什么我需要提供一个 API 密钥 - 我确实尝试生成一个 API 密钥,然后我收到了一个权限错误,这是有道理的,因为工作表不是公开的。

感谢您为我指明正确方向提供的任何帮助。

标签: google-sheets-api

解决方案


在您的脚本中,如何进行以下修改?

从:

const sheets = google.sheets({version: 'v4', jwtObject});

至:

const sheets = google.sheets({version: 'v4', auth: jwtObject});

笔记:

  • 当我测试时const sheets = google.sheets({version: 'v4', jwtObject});,我向你确认了同样的问题。所以,当我像上面那样修改你的脚本时,我确认问题已经解决,并且从电子表格中检索了值。

推荐阅读