Google API Node.js 库 - 在项目级别向服务帐户授予角色

Google API Node.js Library - Grant Role to service account at project level

目标

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

问题

当我尝试更新我的服务帐户 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));
    });
}

在此功能 运行s 之后,我确定服务帐户已创建,我 运行 我的 功能旨在设置此服务帐户的角色。

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 客户端库或节点应用程序本身 运行ning 所述 gcloud 命令?

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

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

使用getIamPolicy and setIamPolicy。示例包含在文档中。

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