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 服务帐户,这通过帐户最容易完成你提到的关键。
据我所知,在 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 服务帐户,这通过帐户最容易完成你提到的关键。