【发布时间】: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