代码之家  ›  专栏  ›  技术社区  ›  SubZeno

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

  •  2
  • SubZeno  · 技术社区  · 7 年前

    我正在为谷歌云平台开发我的第一个应用程序。

    特别是,我使用的是Node。js作为基础框架。谷歌本身提供 Node.js client libraries 与他们的服务交互。

    例如,此代码能够在云存储中创建新的bucket:

    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应用程序引擎上部署此代码,则上述操作是使用服务帐户(至少我认为是这样)而不是作为最终用户完成的,即使在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
      }});
    

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   David    7 年前

    您有两个选项来确保允许您的请求:

    1. 向您的服务帐户授予对bucket和/或对象的必要权限。如果您控制数据,但如果您的应用程序必须与用户控制的桶/对象一起运行,则此操作不起作用。

    2. 执行“三条腿Oauth”流程以获得代表用户进行呼叫的权限。很遗憾,您正在调用的客户端库不支持此操作。我不知道你从哪里得到的 auth:{'bearer':...} 但是,即使这样做有效,您传递的令牌也没有访问bucket所需的作用域。

      This autogenerated library 支持三条腿的auth。您可以这样使用它:

      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);
      });