Google 驱动器 API - 服务帐户凭据无效
Google Drive API - Invalid service account credentials
我正在学习使用 Google 驱动器 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 机器人响应命令)。出乎意料的是,它给出了一个身份验证错误,尽管(据我所知)我有意义地改变的只是项目布局。
小启动脚本仍然像在早期测试期间那样工作,更令人困惑的是,在主项目上它现在告诉我我的密钥是错误的,尽管它是我之前使用的完全相同的授权代码和密钥文件。环顾四周,我发现可能是我的密钥已过期,我应该寻找刷新令牌,但我无法找到它的位置或找到它后如何使用它。
有人能给我指出正确的方向吗?
感谢您的宝贵时间。
注意:我使用服务帐户密钥访问 APIs,而不是 OAuth 凭据
编辑 1:
我最终复制了整个测试脚本(虽然仍然与主项目隔离)并将其移动到主项目的目录,果然,它仍然有效。现在我真的不知道发生了什么事。
编辑 2:
我通过删除函数并将其替换为对测试脚本的调用来将小脚本与主项目链接起来(通过将其包装在导出的函数中进行稍微修改,因此它可以作为主项目的模块调用), 它仍然有效。就好像把钥匙锁在了测试脚本里一样
编辑 3:
我现在已经将主项目中有问题的文件替换为工作测试脚本,包括文件名,现在它可以工作了。非常奇怪,但我现在不再收到 401 无效凭据错误。不过,我仍然不知道主项目中的原始文件有什么问题。
Invalid service account credentials
正常情况下,您使用的密钥是无效的。您需要创建一个服务帐户密钥文件。
如果您打开 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'],
});
我正在学习使用 Google 驱动器 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 机器人响应命令)。出乎意料的是,它给出了一个身份验证错误,尽管(据我所知)我有意义地改变的只是项目布局。
小启动脚本仍然像在早期测试期间那样工作,更令人困惑的是,在主项目上它现在告诉我我的密钥是错误的,尽管它是我之前使用的完全相同的授权代码和密钥文件。环顾四周,我发现可能是我的密钥已过期,我应该寻找刷新令牌,但我无法找到它的位置或找到它后如何使用它。
有人能给我指出正确的方向吗?
感谢您的宝贵时间。
注意:我使用服务帐户密钥访问 APIs,而不是 OAuth 凭据
编辑 1:
我最终复制了整个测试脚本(虽然仍然与主项目隔离)并将其移动到主项目的目录,果然,它仍然有效。现在我真的不知道发生了什么事。
编辑 2:
我通过删除函数并将其替换为对测试脚本的调用来将小脚本与主项目链接起来(通过将其包装在导出的函数中进行稍微修改,因此它可以作为主项目的模块调用), 它仍然有效。就好像把钥匙锁在了测试脚本里一样
编辑 3:
我现在已经将主项目中有问题的文件替换为工作测试脚本,包括文件名,现在它可以工作了。非常奇怪,但我现在不再收到 401 无效凭据错误。不过,我仍然不知道主项目中的原始文件有什么问题。
Invalid service account credentials
正常情况下,您使用的密钥是无效的。您需要创建一个服务帐户密钥文件。
如果您打开 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'],
});