【问题标题】:Google Drive API - Invalid service account credentialsGoogle Drive API - 服务帐户凭据无效
【发布时间】:2021-12-29 13:21:54
【问题描述】:

我正在学习使用 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 机器人)。出乎意料的是,即使(据我所知)我有意义地更改的只是项目布局,它也会给出身份验证错误。

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

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

感谢您的宝贵时间。

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


编辑 1:

我最终复制了整个测试脚本(尽管仍然与主项目隔离)并将其移至主项目的目录,果然,它仍然有效。现在我真的不知道发生了什么。

编辑 2:

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

编辑 3:

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

【问题讨论】:

  • 您遇到的错误是什么?另外,您是否尝试过仅为主应用程序创建一个新的服务帐户?
  • @Kessy 在尝试获取 auth 对象时,这是一个 401 Invalid Credentials,它适用于小型测试项目。除了用小测试测试它之外,服务帐户是新鲜的,希望将其回收用于主要项目。我以为我只是复制凭据文件。

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


【解决方案1】:

服务帐户凭据无效

通常意味着您使用的密钥罚款无效。您需要创建一个服务帐号密钥文件。

如果您打开 json 密钥文件,它应该看起来像这样

{
  "type": "service_account",
  "project_id": "Redacted-305109",
  "private_key_id": "Redacted",
  "private_key": "-----BEGIN PRIVATE KEY-----Redacted---END PRIVATE KEY-----\n",
  "client_email": "Redacted@testapikey-305109.iam.gserviceaccount.com",
  "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'],
});

【讨论】:

  • 是的,这就是密钥文件的外观。该文件是有效的,如小测试项目所见,但将代码和密钥文件复制到主项目,它突然无效。
  • 我非常希望它可以访问该文件,它被正确复制并且应用程序可以访问它。
  • 我很确定密钥已正确复制并且应用程序可以访问它,否则我会收到 ENOENT 错误。
  • 我已经设法通过将主项目文件与测试脚本交换来使其工作 - 但不确定到底发生了什么。不管怎样,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 2012-10-26
  • 2016-11-18
  • 2016-03-03
相关资源
最近更新 更多