【问题标题】:googleapis fails ( after JWT Auth ) with TypeError: authClient.request is not a functiongoogleapis 失败(在 JWT Auth 之后)并出现 TypeError: authClient.request is not a function
【发布时间】:2020-04-27 12:18:02
【问题描述】:

我正在尝试访问 google 表格电子表格,该表格与 API 密钥属于同一帐户。我正在使用 JWT,因为在交互过程中没有用户在场。

以下是我认为获取工作表内容的最小实现。

它总是以TypeError: authClient.request is not a function 失败

在我看来,身份验证令牌已成功创建。

const fs = require('fs');
const { google } = require('googleapis');

fs.readFile('./<credentials>.json','utf-8',(e,content) => {
    if ( e ) return console.log('error',e);
    authorize(JSON.parse(content))
});

function authorize(credentials) {
    let jwtClient = new google.auth.JWT(
        credentials.client_email,
        null,
        credentials.private_key,
        ['https://www.googleapis.com/auth/spreadsheets.readonly']
    )
    jwtClient.authorize((e,auth) => {
        if ( e ) return console.log('authorize error',e);

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

        sheets.spreadsheets.values.get({
            spreadsheetId: '<sheet_id>',
            range: 'Class Data!A1:E20',
          },(err,res) => {
              if ( err ) return console.log('SHEETS err',err);
              console.log('SHEETS res',res);
          });
    });    
};

报告的错误(完整)始终...

SHEETS err TypeError: authClient.request is not a function
    at /Users/web7/google-sheets/node_modules/googleapis-common/build/src/apirequest.js:238:31
    at Generator.next (<anonymous>)
    at /Users/web7/google-sheets/node_modules/googleapis-common/build/src/apirequest.js:19:71
    at new Promise (<anonymous>)
    at __awaiter (/Users/web7/google-sheets/node_modules/googleapis-common/build/src/apirequest.js:15:12)
    at createAPIRequestAsync (/Users/web7/google-sheets/node_modules/googleapis-common/build/src/apirequest.js:56:12)
    at Object.createAPIRequest (/Users/web7/google-sheets/node_modules/googleapis-common/build/src/apirequest.js:48:9)
    at Resource$Spreadsheets$Values.get (/Users/web7/google-sheets/node_modules/googleapis/build/src/apis/sheets/v4.js:573:37)
    at jwtClient.authorize (/Users/web7/google-sheets/Server.js:25:36)
    at authorizeAsync.then.r (/Users/web7/google-sheets/node_modules/google-auth-library/build/src/auth/jwtclient.js:117:45)

Auth Token 的格式为:-

{
 access_token: "<long_key>",
 token_type: "Bearer",
 expiry_date: 1587993215000,
 id_token: undefined,
 refresh_token: "jwt-placeholder"
}

【问题讨论】:

    标签: javascript node.js google-sheets google-api


    【解决方案1】:

    这个修改怎么样?

    修改点:

    • 请使用jwtClientauth,如const sheets = google.sheets({ version: "v4", auth: jwtClient })。我认为您的问题的原因可能是这个。

    修改脚本:

    当你的脚本被修改后,变成如下。

    从:
    jwtClient.authorize((e,auth) => {
        if ( e ) return console.log('authorize error',e);
    
        const sheets = google.sheets({version: 'v4', auth });
    
        sheets.spreadsheets.values.get({
            spreadsheetId: '<sheet_id>',
            range: 'Class Data!A1:E20',
          },(err,res) => {
              if ( err ) return console.log('SHEETS err',err);
              console.log('SHEETS res',res);
          });
    });
    
    到:
    jwtClient.authorize((err) => {
      if (err) console.log(err);
    });
    const sheets = google.sheets({ version: "v4", auth: jwtClient });
    sheets.spreadsheets.values.get(
      {
        spreadsheetId: '<sheet_id>',
        range: 'Class Data!A1:E20',
      },
      (err, res) => {
        if (err) return console.log("SHEETS err", err);
        console.log("SHEETS res", res.data);
      }
    );
    

    注意:

    • 在此修改中,假设您已经使用您的服务帐户获取并输入了 Google 电子表格的值。

    【讨论】:

    • 如果我将 auth 替换为 auth: jwtClient 我会收到错误 Error: The caller does not have permission 我不确定使用我的服务帐户“获取并放置值”是什么意思。表格是使用我的标准帐户直接在 Google 表格中创建的。
    • @user3094755 感谢您的回复。我带来的不便表示歉意。能否问一下,Google 电子表格是否已经与服务帐号的邮箱共享?因为为了使用服务帐户访问 Google 电子表格,电子表格需要与服务帐户的电子邮件共享。可以再确认一下吗?
    • auth: jwtClient 的更改修复了最初的问题,因此它只是权限问题,您的建议使我尝试与生成密钥时由 Google API 创建的电子邮件地址共享工作表. (电子邮件发送失败),但权限已添加到工作表中,因此现在可以使用 - 谢谢。
    • @user3094755 感谢您的回复。我很高兴你的问题得到了解决。关于The email send fails,看来这是服务帐号的规范。我为此道歉。如果您的问题得到解决,请按接受按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。我认为您的问题和解决方案将对他们有用。如果找不到按钮,请随时告诉我。 stackoverflow.com/help/accepted-answer
    猜你喜欢
    • 2019-12-16
    • 2019-05-26
    • 2016-04-22
    • 2021-12-24
    • 2015-11-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多