node.js - Google Drive API - 无效的服务帐户凭据

标签 node.js google-api google-drive-api service-accounts google-api-nodejs-client

我正在学习使用 Google Drive API,并从一个远离任何内容的小脚本开始:

import * as fs from "fs";
import * as gdrive from "@googleapis/drive";

const auth = new gdrive.auth.GoogleAuth({
    keyFile: "creds.json",
    scopes: [ "https://www.googleapis.com/auth/drive" ]
});

const ds = gdrive.drive({ version: "v3", auth });

const meta = {
    "name": "uploadme.csv",
    "parents": [ "XXX" ] // Folder ID
};

const body = {
    mimeType: "text/csv",
    body = fs.createReadStream("uploadme.csv")
};

async function yeet() {
    const res = await ds.files.create({
        requestBody: meta,
        media: body
    });
    console.log(res);
}
yeet();

这个小脚本有效(返回状态 200,我看到文件已上传到我指定的文件夹),我继续将其与我的主项目集成,主要是直接复制小脚本。唯一的区别是不同的文件夹结构和不同的调用堆栈,在小示例中,我将所有内容都放在项目根目录中,而主项目具有更复杂的布局和程序流程(响应命令的 Discord 机器人)。出乎意料的是,它给出了身份验证错误,即使(据我所知)我有意义地更改的是项目布局。

这个小启动脚本仍然像早期测试期间一样工作,更令人困惑的是,在主项目上,它现在告诉我我的 key 是坏的,尽管它与我之前使用的完全相同的身份验证代码和 key 文件。环顾四周,我发现我的 key 可能已过期,我应该寻找刷新 token ,但我无法找到它在哪里,也无法找到它时如何使用它。

有人可以给我指出正确的方向吗?

感谢您的宝贵时间。

注意:我使用服务帐户 key 来访问 API,而不是 OAuth 凭据


编辑1:

我最终复制了整个测试脚本(尽管仍然与主项目隔离)并将其移动到主项目的目录中,果然,它仍然有效。现在我真的对发生的事情感到困惑。

编辑2:

我通过删除函数并将其替换为对测试脚本的调用来将小脚本与主项目链接起来(通过将其包装在导出函数中进行稍微修改,以便它可以作为主项目中的模块进行调用),它仍然有效。就好像 key 被锁定在测试脚本中一样。

编辑3:

我现在已将主项目中有问题的文件替换为工作测试脚本(包括文件名),现在它可以工作了。非常奇怪,但我现在不再收到 401 无效凭据错误。不过,我仍然不知道主项目中的原始文件出了什么问题。

最佳答案

Invalid service account credentials

通常意味着您使用的 key 无效。您需要创建一个服务帐户 key 文件。

如果你打开 json key 文件,它应该看起来像这样

{
  "type": "service_account",
  "project_id": "Redacted-305109",
  "private_key_id": "Redacted",
  "private_key": "-----BEGIN PRIVATE KEY-----Redacted---END PRIVATE KEY-----\n",
  "client_email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="91c3f4f5f0f2e5f4f5d1e5f4e2e5f0e1f8faf4e8bca2a1a4a0a1a8bff8f0fcbff6e2f4e3e7f8f2f4f0f2f2fee4ffe5bff2fefc" rel="noreferrer noopener nofollow">[email protected]</a>",
  "client_id": "Redacted",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/Redacted-305109.iam.gserviceaccount.com"
}

how to create a service account key file

文档:google-api-nodejs-client#service-account-credentials

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

const auth = new google.auth.GoogleAuth({
  keyFile: '/path/to/your-secret-key.json',
  scopes: ['https://www.googleapis.com/auth/cloud-platform'],
});

关于node.js - Google Drive API - 无效的服务帐户凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70520038/

相关文章:

node.js - 无法读取 NodeJS 中未定义的属性 'F_OK'

swift - 如何使用 swift 4 调用 google map api?

go - 将 google-apis 用于 google 表格,如何根据条件更新特定单元格

image - Google AJAX API - 我如何获得超过 4 个结果?

R:下载 Google 云端硬盘公用文件夹中的所有文件

ios - 如何在 Dr.Edit 示例代码中从 Google Drive 上传和访问电子表格文件?

android - Android 应用程序和 Web 应用程序(appengine)之间的 Google Drive 文件共享

javascript - 当我在 Amazon S3 中将 Quiet 设置为 true 以在 deleteObjects() 方法中启用安静模式时会发生什么?

javascript - JS - 是否每次创建类时都重新定义类成员函数?

javascript - 发送 html+css 作为响应的简单 node.js 服务器