【问题标题】:Unauthorized for only clear requests Google Sheets API未经授权仅用于清除请求 Google Sheets API
【发布时间】:2018-09-04 15:25:35
【问题描述】:

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

在我的开发环境中,我使用的是我所属组织之外的服务用户。这会对授权哪些呼叫产生影响吗?查看在组织级别设置共享权限的文档,控制似乎没有那么细。

    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);

{ 消息:'请求缺少所需的身份验证凭据。 预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。 见https://developers.google.com/identity/sign-in/web/devconsole-project.', 域:'全球', 原因:'未经授权'}

【问题讨论】:

    标签: node.js google-api google-oauth google-spreadsheet-api google-api-js-client


    【解决方案1】:

    '请求缺少所需的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。

    表示您没有随请求发送凭据。

    您没有将 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;
     }
    

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      相关资源
      最近更新 更多