我正在为 Google Cloud Platform 开发我的第一个应用程序。
特别是,我使用 Node.js 作为基础框架。Google 本身提供Node.js 客户端库来与其服务交互。
例如,此代码能够在 Cloud Storage 中创建一个新存储桶:
var storage = require('@google-cloud/storage')();
var bucket = storage.bucket('albums');
bucket.create(function(err, bucket, apiResponse) {
if (!err) {
// The bucket was created successfully.
}
});
//-
// If the callback is omitted, we'll return a Promise.
//-
bucket.create().then(function(data) {
var bucket = data[0];
var apiResponse = data[1];
});
但是,如果我在 Google Application Engine 上部署此代码,则上述操作是使用服务帐户(我想至少)而不是作为最终用户完成的,即使在 OAuth 身份验证之后也是如此,因此忽略了现有的 IAM 策略。
我怎样才能避免这个问题,并为我的请求使用以用户为中心的流程?我可以使用身份识别代理吗?如果是,如何?
更新
为了让我的问题更容易理解:
考虑这段代码:
router.get('/test2', oauth2.required, (req, res, next) => {
const Storage = require('@google-cloud/storage');
// Creates a client
const storage = new Storage();
// Lists all buckets in the current project
storage
.getBuckets()
.then(results => {
const buckets = results[0];
console.log('Buckets:');
buckets.forEach(bucket => {
console.log(bucket.name);
});
res.send("There are " + buckets.length + " buckets.");
})
.catch(err => {
res.send(err);
});
});
如果给定用户已经通过 OAuth2 登录,则可以调用此路由。
我想调用getBuckets()
传递 OAuth accessToken 的方法来模拟用户本身来执行此操作。通过这种方式,该操作无法跳过 GCP 中针对当前登录的给定用户的 IAM 规则。
我滴滴尝试:
const storage = new Storage({
auth: {
'bearer': req.user.accessToken
}});
但它不起作用。该应用程序仍然使用我的默认帐户。