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

如何使用服务帐户从应用程序脚本访问云数据存储

  •  2
  • mooose  · 技术社区  · 6 年前

    尝试使用这样的服务帐户从google apps脚本访问google云数据存储。我从 here 我不确定这个范围是否合适,或者是否需要另一个范围。 运行函数run()会出现如下错误:“检索令牌时出错:invalid\u scope, https://www.googleapis.com/auth/userinfo.email 不是有效的访问群体字符串。“”

    // testing Cloud Datastore access via service account
    var PRIVATE_KEY = "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n";
    var CLIENT_EMAIL = "xxxxxxxxxxx@appspot.gserviceaccount.com";
    var USER_EMAIL = "myemailaddress@mydomain.com";
    var CLIENT_ID = "104548139575444821912";
    var SCOPE = "https://www.googleapis.com/auth/datastore/v1"; 
    
    /**
     * Authorizes and makes a request to the Cloud Datastore 
     */
    function run() {
      var service = getService();
      if (service.hasAccess()) {
        var url = SCOPE;
        var response = UrlFetchApp.fetch(url, {
          headers: {
            Authorization: 'Bearer ' + service.getAccessToken()
          }
        });
    
        var result = JSON.parse(response.getContentText());
        Logger.log(JSON.stringify(result, null, 2));
      } else {
        Logger.log(service.getLastError());
      }
    }
    
    /**
     * Reset the authorization state, so that it can be re-tested.
     */
    function reset() {
      getService().reset();
    }
    
    /**
     * Configures the service.
     */
    function getService() {
      return OAuth2.createService('CloudDatastore:' + USER_EMAIL)
          // Set the endpoint URL.
          .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    
          // Set the private key and issuer.
          .setPrivateKey(PRIVATE_KEY)
          .setIssuer(CLIENT_EMAIL)
          // .setClientId(CLIENT_ID)
    
          // Set the name of the user to impersonate. This will only work for
          // Google Apps for Work/EDU accounts whose admin has setup domain-wide
          // delegation:
          // https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority
          // .setSubject(USER_EMAIL)
    
          // Set the property store where authorized tokens should be persisted.
          .setPropertyStore(PropertiesService.getScriptProperties())
    
          // Set the scope. This must match one of the scopes configured during the
          // setup of domain-wide delegation.
          .setScope('https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/datastore/v1');
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Martin Zeitler    6 年前

    是否尝试过不请求该范围,而该范围在示例中根本没有说明?请求范围 https://www.googleapis.com/auth/datastore 。尽管如此 GoogleDrive 示例有 PRIVATE_KEY , CLIENT_EMAIL , USER_EMAIL (需要分配服务帐户的主键和电子邮件地址)。。。虽然它指出:

    // Set the name of the user to impersonate. This will only work for
    // Google Apps for Work/EDU accounts whose admin has setup domain-wide delegation:
    // https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority
    .setSubject(USER_EMAIL)
    

    如果您的帐户既不用于工作(GSuite)也不用于教育,则您将无法模拟服务帐户;这给您留下了两个选项:a)不要试图用服务帐户模拟任何人,或b)创建具有域范围委派的GSuite域。很明显,在同一个域上不能这样做 gmail.com ,授权域外帐户也行不通;如果是 GSuite 域,请参阅 domain-wide delegation

    有没有试过 var SCOPES="https://www.googleapis.com/auth/cloud-platform, https://www.googleapis.com/auth/datastore"; 然后 .setScope(SCOPES) ?正在请求 invalid_scope 不会导致任何结果,这意味着无效或未配置委派。 它指出

    这必须与在设置域范围委派期间配置的一个作用域相匹配。

    Perform G Suite Domain-Wide Delegation of Authority 解释一下。创建时需要启用域范围的委派 service account -然后在 Admin Console OAuth2ServiceAccount 是ID协议。

    Screenshot 01

    在高级设置下>身份验证(>);管理API客户端访问,需要有添加了相应API作用域的服务帐户的电子邮件地址(该错误消息来自之前的输入,可能需要两个作用域): Screenshot 02

    在云控制台上,大致相同: Screenshot 03

    请参见 API documentation 第一连接后,请参阅 console

    添加了一个示例 rest/v1/projects (也可以在那里构建/测试请求)到我的GitHub:

    看见 CloudDatastore.gs (它加载配置 .json 来自Google Drive)。