我正在学习使用 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/