node.js - 仅针对明确的请求 Google Sheets API 未经授权

标签 node.js google-api google-oauth google-sheets-api google-api-js-client

我在 node.js 应用程序中使用 Google Sheets API v4。我正在使用 JWT 客户端进行身份验证,范围设置为“http://www.googleapis.com/auth/spreadsheets” '。我发现我可以成功更新工作表或执行追加操作,但在尝试清除工作表时收到 401 未经授权的错误。

在我的开发环境中,我使用的服务用户不属于我所属的组织。这会影响哪些调用被授权吗?查看在组织级别设置共享权限的文档,控制似乎没有那么细粒度。

    auth(scopes) {
    const key = process.env.GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY;
    const email = process.env.GOOGLE_SERVICE_ACCOUNT_CLIENT_EMAIL;
    const jwtClient = new google.auth.JWT(email, null, key, scopes);
    jwtClient.authorize((err) => {
      if (err) {
        console.log(err);
      }
    });
    return jwtClient;
  }

...

async updateSheet(jwtClient, spreadsheet_id, sheet_name, data) {
     const write = util.promisify(sheets.spreadsheets.values.update);
     const body = {
         majorDimension: 'COLUMNS',
         values: data
     };
     const request = {
         spreadsheetId: spreadsheet_id,
         range: sheet_name,
         valueInputOption: 'user_entered',
         resource: body,
         auth: jwtClient,
     };
     const response = await write(request);
     return response;
 },
 async clearSheet(jwtClient, spreadsheet_id, sheet_name) {
     const clear = util.promisify(sheets.spreadsheets.values.clear);
     const request = {
         spreadsheetId: spreadsheet_id,
         range: sheet_name
     };
     const response = await clear(request);
     return response;
 }

使用相同的jwt客户端、电子表格id和工作表名称,第一次调用成功,但第二次调用失败。

await google.updateSheet(google_jwtClient, spreadsheet_id, sheet_name, data);
await google.clearSheet(google_jwtClient, spreadsheet_id, sheet_name);

{ message: 'Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.', domain: 'global', reason: 'unauthorized' }

最佳答案

'Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential.

意味着您没有随请求一起发送凭据。

您没有将 jwtClient 应用于请求。

 async clearSheet(jwtClient, spreadsheet_id, sheet_name) {
     const clear = util.promisify(sheets.spreadsheets.values.clear);
     const request = {
         spreadsheetId: spreadsheet_id,
         auth: jwtClient,
         range: sheet_name
     };
     const response = await clear(request);
     return response;
 }

关于node.js - 仅针对明确的请求 Google Sheets API 未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49492221/

相关文章:

node.js - 如何使用 webstorm 中的 Grunt 调试 Node

javascript - 我如何执行一大批 promise ?

python - 使用 Python Gspread 访问 Google Drive 电子表格

android - 多服务器环境中的 Android 应用程序的 Google 登录?

javascript - Electron 的 OAuth 2.0 客户端密码

javascript - 绑定(bind)函数的奇怪行为

javascript - 无法读取 nodeJS 中的 URL 编码

javascript - 带有 Google JavaScript Client Lib 的 Google Contacts API

php - Youtube Analytics API的速率限制?

authentication - Google oAuth 登录 - 如何仅允许白名单电子邮件登录我的应用程序