我正在开发我的第一个Google Cloud Platform应用程序。
特别是,我使用Node.js作为基础框架。 Google本身提供Node.js client libraries与其服务进行互动。
例如,此代码能够在云存储中创建新存储桶:
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策略的地方。
我怎样才能避免这个问题,并为我的请求使用以用户为中心的流程?我可以使用Identiy-Aware Proxy吗?如果是,怎么样?
更新
让我的问题更容易理解:
考虑以下代码:
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登录,则可以调用此路由。
我想调用传递OAuth accessToken的getBuckets()
方法来执行模拟用户本身的操作。
通过这种方式,操作无法跳过GCP中针对当前记录的给定用户的IAM规则。
我试过了:
const storage = new Storage({
auth: {
'bearer': req.user.accessToken
}});
但它不起作用。该应用程序仍然使用我的默认帐户。
答案 0 :(得分:0)
您有两种方法可以确保您的请求被允许:
将存储桶和/或对象的必要权限授予您的服务帐户。这可以控制数据,但如果您的应用程序必须使用用户控制的存储桶/对象,则无效。
做好三条腿的Oauth"流程以获得代表用户拨打电话的权限。不幸的是,您呼叫的客户端库并不支持此功能。我不知道你从哪里得到auth:{'bearer':...}
,但即使这样做了,你传递的令牌也不具备访问存储桶所需的范围。
This autogenerated library确实支持三条腿认证。你可以像以下一样使用它:
var google = require('googleapis');
var OAuth2 = google.auth.OAuth2;
var oauth2Client = new OAuth2(
YOUR_CLIENT_ID,
YOUR_CLIENT_SECRET,
YOUR_REDIRECT_URL
);
function handle_requests_to_redirect_url() {
// extract code query string parameter
token = await oauth2Client.getToken(code);
// Save token
}
if (no_known_auth_token_for_user()) {
// redirect user to
oauth2Client.generateAuthUrl({access_type:'offline', scope: ['https://www.googleapis.com/auth/devstorage.read_write']});
// after clicking OK, user is redirected to YOUR_REDIRECT_URL
}
var token = get_saved_token_for_this_user();
oauth2Client.setCredentials(token);
var storage = google.storage({version: 'v1', auth: oauth2Client});
storage.buckets.list(function (e,res) {
console.log(res);
});