Google云客户端库和用户身份验证

时间:2018-02-27 09:58:08

标签: node.js google-cloud-platform google-cloud-storage google-iap

我正在开发我的第一个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
  }});

但它不起作用。该应用程序仍然使用我的默认帐户。

1 个答案:

答案 0 :(得分:0)

您有两种方法可以确保您的请求被允许:

  1. 将存储桶和/或对象的必要权限授予您的服务帐户。这可以控制数据,但如果您的应用程序必须使用用户控制的存储桶/对象,则无效。

  2. 做好三条腿的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);
    });
    
相关问题