【问题标题】:How do I call a REST Google Cloud API from AppMaker?如何从 AppMaker 调用 REST Google Cloud API?
【发布时间】:2020-03-04 15:25:22
【问题描述】:

我想从 AppMaker 调用 Google Cloud AutoML API,但很难弄清楚该怎么做。如何从 AppMaker 对 Google Cloud 进行 REST 调用?

【问题讨论】:

    标签: google-cloud-platform google-app-maker google-cloud-ml google-cloud-automl


    【解决方案1】:

    首先,按照here的说明生成服务帐号并下载私钥。 (我还假设您已经为您的项目启用了 API。)

    然后,按照“附录:没有 OAuth 的服务帐户授权”部分下的说明进行操作,但您需要实现自己的 JWT 编码算法,如下所示:

    var base64Encode = function (str) {
        var encoded = Utilities.base64EncodeWebSafe(str);
        // Remove padding
        return encoded.replace(/=+$/, '');
    };
    
    // https://developers.google.com/identity/protocols/OAuth2ServiceAccount
    // https://wtfruby.com/gas/2018/11/21/jwt-app-scripts.html
    
    var getJWT = function (secret) {
        var header = JSON.stringify({
            typ: 'JWT',
            alg: 'RS256',
            kid: '...'
        });
        var encodedHeader = base64Encode(header);
        var iat = new Date().getTime() / 1000;
        var exp = iat + 3600;
        var payload = JSON.stringify({
          iss: "...",
          sub: "...",
          aud: "https://automl.googleapis.com/",
          iat: iat,
          exp: exp
        });
        var encodedPayload = base64Encode(payload);
        var toSign = [encodedHeader, encodedPayload].join('.');
        var signature = Utilities.computeRsaSha256Signature(toSign, secret);
        var encodedSignature = base64Encode(signature);
        return [toSign, encodedSignature].join('.');
    };
    
    • 从服务定义文件in the Google APIs GitHub repository获取API的服务名称和API名称
    • 对于标题中的 Kid 字段,指定您的服务帐户的私钥 ID。您可以在您的 private_key_id 字段中找到此值 服务帐户 JSON 文件。
    • 对于 iss 和 sub 字段,指定您的 服务帐户的电子邮件地址。您可以在 您的服务帐户 JSON 文件的 client_email 字段。
    • 对于审计 字段,指定 https://SERVICE_NAME/,使用来自 服务定义文件。
    • 对于 iat 字段,指定当前的 Unix 时间,对于 exp 字段,精确地指定时间 3600 秒 稍后,当 JWT 到期时。

    使用 RSA-256 对 JWT 进行签名 在您的服务帐号 JSON 文件中找到私钥。

    然后按如下方式进行 REST 调用:

    function makeRestCall() {
    
      var jwt = getJWT();
      var options = {
        'method' : 'post',
        'contentType': 'application/json',
        'headers': {
          'Authorization': 'Bearer ' + jwt, 
        },
        'muteHttpExceptions': true,
        'payload' : ...
      };
    
      var url = 'https://automl.googleapis.com/...';  
      return JSON.parse(UrlFetchApp.fetch(url, options).getContentText());
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 2016-05-22
      • 2018-08-13
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 2019-07-26
      相关资源
      最近更新 更多