我正在尝试使用服务帐户通过 NodeJS 服务器连接到 Google Drive API。目标是让服务器能够作为服务帐户进行身份验证,从驱动器中检索相关文件,并将它们发送回用户,而无需用户直接登录 Google。这将允许我通过我的网络应用程序控制文件访问,而不必通过 Drive 手动共享和取消共享文件。根据我对 Google Drive API 的理解,这应该都是可能的。问题是我什至不知道如何验证我的服务器。服务器在 AWS EC2 实例上运行。澄清一下,我不希望用户必须使用前端界面进行身份验证。
我已按照 快速入门指南 并按照 here 的说明设置服务帐户和密钥,但是按照第二个链接中的说明创建密钥后,看起来我没有正确的
credentials.json
文件.我在 Google Developer Console 上生成密钥后得到的 JSON 文件具有以下对象键(值有意删除):
type
, project_id
, private_key_id
, private_key
, client_email
, client_id
, auth_uri
, token_uri
, auth_provider_x509_cert_url
, client_x509_cert_url
快速入门指南建议此文件应在某些
client_secret
对象 (redirect_uris
) 中包含 installed
和 const {client_secret, client_id, redirect_uris} = credentials.installed;
:
尝试运行此
index.js
快速启动文件会导致抛出错误,因为 installed
不存在于 credentials.json
中。我在哪里可以生成必要的凭据文件?还是我完全走错了路?
像 this 这样的帖子在旧版本的快速入门文档中引用了类似的问题,但是这里的解决方案没有帮助,因为我的凭据文件中没有
client_secret
键。
当我看到您的
credentials.json
文件的显示密钥时,我了解到该文件是服务帐户的凭据文件。如果我的理解是正确的,当我看到你的展示脚本时,该脚本似乎是针对 OAuth2 的。在这种情况下,此脚本不能用于服务帐户。我认为这就是您当前问题的原因。
为了使用服务帐户使用 Drive API,下面的示例脚本怎么样?
使用本脚本前,请设置服务账号
credentialFilename
。在这种情况下,请包含路径。
const { google } = require("googleapis");
const credentialFilename = "credentials.json";
const scopes = ["https://www.googleapis.com/auth/drive.metadata.readonly"];
const auth = new google.auth.GoogleAuth({keyFile: credentialFilename, scopes: scopes});
const drive = google.drive({ version: "v3", auth });
// This is a simple sample script for retrieving the file list.
drive.files.list(
{
pageSize: 10,
fields: "nextPageToken, files(id, name)",
},
(err, res) => {
if (err) return console.log("The API returned an error: " + err);
const files = res.data.files;
console.log(files);
}
);
https://www.googleapis.com/auth/drive.metadata.readonly
作为范围。请根据您的实际情况进行修改。如果其他人花了太多时间研究如何使用服务帐户进行身份验证,这就是我上传文件的方式:
const { google } = require('googleapis');
const drive = google.drive('v3');
const auth = new google.auth.GoogleAuth({
credentials: {
client_email: process.env.CLIENT_EMAIL,
client_id: process.env.CLIENT_ID,
private_key: process.env.PRIVATE_KEY,
},
scopes: [
'https://www.googleapis.com/auth/drive',
],
});
async function handler(req, res) {
const authClient = await auth.getClient();
google.options({ auth: authClient });
try {
await drive.files.create({
requestBody: {
name: 'Test',
mimeType: 'text/plain',
parents: [FOLDER_ID], // make sure to share the folder with your service account
},
media: {
mimeType: 'text/plain',
body: 'Hello World',
},
});
} catch (error) {
return res.status(500).json({ error: `Error adding row. ${error.message}` });
}
return res.status(201).json({ message: 'Done' });
}
export default handler;