Using Google Drive API from cloud function 使用默认服务帐户而不生成密钥

Using Google Drive API from cloud function using the default service account without generating a key

据我所知,在 Google Cloud 上的一项最佳实践是尽可能不使用服务帐户密钥。

这里我有一个 Google 云函数 (nodejs) 通过 Drive API(googleapis 包 v95.0.0)访问 Drive,使用服务帐户密钥(生成的文件通过控制台)。

什么有效:

const settings = require('./config/driveSA.json');
const options = {
         googleKey: settings,
         user: 'test@test.com' //user impersonification
}

const auth = gdriveUtils.prepareJwt(google, options);

const drive = google.drive({ version: 'v3', auth: auth });

const file = await drive.files.get({
    fileId: fileId,
    alt: 'media',
    supportsTeamDrives: true,
});

我想达到的效果:

我想改进这个功能,让它直接使用Cloud Function本身继承的默认服务帐户(与密钥引用的相同)。

这种方法在使用“@google-cloud”相关包时总是有效。就像存储一样,我们可以简单地:

const storage = new Storage();
const bucket = storage.bucket(bucketName);

我试过的:

没有指定任何授权对象:

const drive = google.drive({ version: 'v3' });

const file = await drive.files.get({
    fileId: fileId,
    alt: 'media',
    supportsTeamDrives: true,
});

使用一个没有真正记录的方法:getApplicationDefault

import { GoogleApis, Auth } from 'googleapis';
const adcResponse = await google.auth.getApplicationDefault();
const auth: Auth.GoogleAuth = new google.auth.GoogleAuth(adcResponse);
const drive = google.drive({ version: 'v3', auth: auth });

const file = await drive.files.get({
    fileId: fileId,
    alt: 'media',
    supportsTeamDrives: true,
});

不幸的是,包的 documentation 总是对身份验证部分含糊不清,并且总是在示例中使用密钥。这是可行的吗?还是在这种情况下我必须使用密钥?

谢谢!

正如用户@DalmTo 所提到的,您很可能混合使用了这些帐户。请记住,使用 GCP 服务和 Google API 服务时涉及 2 个服务帐户: GCP 服务帐户:调用函数时使用的是哪个 Cloud Functions(很可能是 App Engine 默认 service account)。 Google API 服务帐户:它有权在您的驱动器上执行各种操作。

如果您希望能够在您的驱动器中执行所有这些活动,请确保您在您的函数中使用 Google API 服务帐户,这通过帐户最容易完成你提到的关键。