【问题标题】:Assigning scopes to a gcloud service account为 gcloud 服务帐号分配范围
【发布时间】:2019-03-18 23:23:00
【问题描述】:

我正在尝试向 GCE 实例(Google Cloud VM)添加一个额外的服务帐户,以便在那里运行的工具可以在 GCloud 分配给 VM 的默认服务帐户和另一个属于不同项目的服务帐户之间切换.从文档中可以清楚地看出我如何将范围分配给默认帐户(关闭电源时在 VM 设置中可用)。但我不明白如何设置手动添加的服务帐户的范围:

gcloud auth activate-service-account --key-file=myaccount.json

现在帐户出现在gcloud auth list,但不清楚分配给它的范围。另一种方法是使用具有--scopes 参数的gcloud auth application-default login,但我知道它不能与服务帐户一起使用。

Google Cloud documentation 告诉我

使用 Google Cloud Platform Console 创建具有适当范围的服务帐号

但我找不到将 Scopes 添加到服务帐户的任何选项,只有角色可以通过 IAM。有谁知道我如何将范围分配给我的自定义服务帐户?

【问题讨论】:

  • 您是在启动时尝试更改分配给 Compute Engine 实例的服务帐户,还是在虚拟机实例启动后尝试在软件中使用自定义服务帐户?范围分配给分配给 Compute Engine 实例的默认服务帐号。对于自定义服务帐户,您使用角色。

标签: google-cloud-platform google-compute-engine gcloud


【解决方案1】:

你可以使用command like

gcloud compute instances set-service-account <instance name> --service-account <service account> --scopes <comma separated scopes here, alias or full URI>

命令文档here 指定别名以及可用的完整 URI。

你也可以使用如下命令:

gcloud alpha compute instances set-scopes <instance name> --scopes <comma separated scopes, alias or full URI>

文档here

范围可以应用于默认服务帐户和虚拟机实例。其他服务帐户(非默认)被视为用户帐户,因此它们不像默认服务帐户那样使用范围。非默认服务账户像用户账户一样使用 IAM 权限,因此您将无法编辑范围,只能像用户账户一样编辑 IAM 角色。如果您要将范围与用户帐户结合使用,则机器和用户帐户都需要访问 API 对象才能访问它。有关范围和服务帐户组合的更多信息 here

【讨论】:

    【解决方案2】:

    我认为您可以通过管理控制台添加范围。在安全页面上,单击高级设置。您可能需要单击显示更多才能查看高级设置。 在身份验证部分中,单击管理 API 客户端访问。 在“客户名称”字段中,输入您的服务帐户的客户 ID。 注意:有关如何创建客户端 ID 的详细信息,请参阅创建服务帐户。

    在一个或多个 API 范围框中,复制并粘贴所需的范围。

    点击授权。 在您输入的客户端 ID 名称旁边,确保所有范围都带有描述。如果没有,请在一个或多个 API 范围框中,再次正确输入范围并单击授权。 正确输入所有范围后,返回 Google Developers Console 并单击保存。

    【讨论】:

    • 谢谢,这听起来很有希望!您能否指出“安全”页面的确切位置?我试图找到它,但我发现的唯一一个看起来像你描述的是support.google.com/a/answer/162106 的 GSuite 管理页面。很遗憾,我没有 GSuite 帐户。
    【解决方案3】:

    如果您有权访问应用程序中的服务帐户 credentials,您还可以像这样以编程方式提供其他范围 -

    Set<String> scopes = Collections.singleton("https://www.googleapis.com/auth/cloud-platform");
    GoogleCredentials googleCredentials = ((ServiceAccountCredentials) credentials).createScoped(scopes);
    
    

    然后您可以通过以下方式获取access_token

    private AccessToken getAccessToken(GoogleCredentials googleCredentials) throws IOException {
        if(googleCredentials.getAccessToken() == null) {
            googleCredentials.refresh();
            return googleCredentials.getAccessToken();
        }
        return googleCredentials.getAccessToken();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-18
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 2020-11-28
      相关资源
      最近更新 更多