【问题标题】:Google API Node.js Library - Grant Role to service account at project levelGoogle API Node.js 库 - 在项目级别向服务帐户授予角色
【发布时间】:2022-02-09 02:43:45
【问题描述】:

目标

将角色 dialogflow.admin 分配给我使用 Google API 的 Node.js 客户端库为项目创建的服务帐户。

问题

当我尝试更新我的服务账户 IAM 政策并向服务账户添加角色时。我收到此资源类型不支持该角色的错误消息。

我正在尝试为我的服务帐户提供 Dialogflow API 管理员角色 roles/dialogflow.admin

我使用的Node.js客户端库中的方法是iam.projects.serviceAccounts.setIamPolicy

我已经成功地使用这个 Node.js 客户端库创建了服务帐户,这里显示了一个函数。

async function createServiceAccount(projectID, serviceAccountID){
    const authClient = await auth.getClient();
    var request = {
        name: "projects/"+projectID,
        resource: {
        "accountId": serviceAccountID,
        "serviceAccount": {
            "description" : "Service Account for project: "+projectID+" for DialogFlow authentication with VA",
            "displayName": "VA Dialogflow Service Account "+projectID
        }
      },
      
      auth: authClient,
    };
  
    await iam.projects.serviceAccounts.create(request, function(err, response) {
      if (err) {
        console.error(err);
        return;
      }
       console.log(JSON.stringify(response, null, 2));
    });
}

在此函数运行后,并且我确定服务帐户已创建,我运行我的 函数,该函数旨在设置此服务帐户的角色。

async function setServiceAccountRoles(projectID, serviceAccountID){
    const authClient = await auth.getClient();
    var request = {
        resource_: "projects/"+projectID+"/serviceAccounts/"+serviceAccountID,
        resource: {
            policy: {
                bindings: [
                    {
                        // role: "projects/"+projectID+"roles/dialogflow.admin",
                        role: "roles/dialogflow.admin",
                        "members": [
                            "serviceAccount:"+serviceAccountID
                        ]
                    }
                    ],
                    version: 1
            }
        },
      
      auth: authClient,
    };
  
    await iam.projects.serviceAccounts.setIamPolicy(request, function(err, response) {
      if (err) {
        console.error(err);
        return;
      }
       console.log(JSON.stringify(response, null, 2));
    });
}

错误

当我运行这个函数时,我给出了这个错误:

  code: 400,
  errors: [
    {
      message: 'Role roles/dialogflow.admin is not supported for this resource.',
      domain: 'global',
      reason: 'badRequest'
    }
  ]

我已经使用以下这些资源来做到这一点: https://cloud.google.com/iam/docs/reference/rest/v1/projects.serviceAccounts/setIamPolicy

https://cloud.google.com/iam/docs/reference/rest/v1/Policy

https://cloud.google.com/iam/docs/granting-changing-revoking-access#granting_access_to_a_service_account_for_a_resource

替代方法。

我尝试将角色更改为项目特定路径,如下所示:

async function setServiceAccountRoles(projectID, serviceAccountID){
    const authClient = await auth.getClient();
    var request = {
        resource_: "projects/"+projectID+"/serviceAccounts/"+serviceAccountID,
        resource: {
            policy: {
                bindings: [
                    {
                        role: "projects/"+projectID+"roles/dialogflow.admin",
                        "members": [
                            "serviceAccount:"+serviceAccountID
                        ]
                    }
                    ],
                    version: 1
            }
        },
      
      auth: authClient,
    };
  
    await iam.projects.serviceAccounts.setIamPolicy(request, function(err, response) {
      if (err) {
        console.error(err);
        return;
      }
       console.log(JSON.stringify(response, null, 2));
    });
}

但是,我得到了错误:message: "Role (projects/va-9986d601/roles/dialogflow.admin) does not exist in the resource's hierarchy.",

是否可以通过控制台或 gcloud 命令更新我的服务帐户的角色和权限?如果是这样,是否有任何推荐的方式通过 node.js 客户端库或从节点应用程序本身运行所述 gcloud 命令?

【问题讨论】:

    标签: node.js google-cloud-platform google-api google-cloud-iam google-client


    【解决方案1】:

    您正尝试在 服务帐号 上设置 IAM 政策。这用于授予其他身份访问服务帐户本身的权限。

    您应该修改项目的 IAM 绑定,而不是服务帐户。

    使用getIamPolicysetIamPolicy。文档中包含示例。

    警告:在编写修改项目绑定的代码时要非常小心。如果您覆盖绑定,您可以轻松地将自己锁定在项目之外。然后,您需要向 Google Cloud Support 开具付费支持票证。练习一次性项目。

    【讨论】:

    • 这绝对让我走上了正轨,谢谢。我在尝试使用您链接的 setIamPolicy 方法时收到PERMISSION_DENIED 错误...我用来验证我的整个 node.js 应用程序的服务帐户具有我正在创建这些项目的组织的所有者权限。你知道是否有特定的权限可以打开这个用例吗?我在这个文档中找不到确切的要求。
    • @gene - IAM 角色 Owner 具有正确的权限。这意味着您使用的服务帐户没有您认为的权限。如果您有权限问题,请创建一个新问题,因为您的原始问题已得到解答。注意:服务帐户需要 IAM 角色 roles/resourcemanager.projectIamAdmin 或类似角色。 cloud.google.com/iam/docs/granting-changing-revoking-access
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多