GCP 云 运行 通过单独项目中的 2 个服务帐户使用短期凭据调用另一个项目云功能

GCP Cloud Run Invoke another Projects Cloud function using short-lived credentials via 2 service accounts in separate Projects

我已经完成了下面的操作,并且一切正常,直到最后一个标记被用来调用一个 云函数。

我在项目 2 中创建了一个服务帐户 (SP),具有 Service-Account-Token-Creator 和 Cloud-Functions-Invoker 角色。我还在项目 1 中使用 Service-Account-Token-Creator 创建了另一个服务帐户 (sc)。我编辑了 SP 的 IAM 绑定,以允许 SC 通过 Service-Account-Token-Creator 角色创建短期凭证。

项目 1 中的以下代码在 CloudRun 上 运行 并且使用服务帐户 SC 作为实例的默认服务帐户。

不确定到底哪里出了问题,但我想做的就是模拟 SP,然后能够调用 SP 帐户中的云功能。

任何有关问题的帮助都会有所帮助。

      import { Compute } from 'google-auth-library';

      const client = new Compute({
        // Specifying the service account email is optional.
        serviceAccountEmail:
          'sc@swaymeebusinessapp.iam.gserviceaccount.com',
      });

      const res = await client.request<{
        accessToken: string;
        expireTime: string;
      }>({
        url:
          'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/sp@<project-di>.iam.gserviceaccount.com:generateAccessToken',
        method: 'POST',
        data: JSON.stringify({
          delegates: [],
          scope: ['https://www.googleapis.com/auth/cloud-platform'],
          lifetime: '300s',
        }),
      });

      request.http.headers.set(
        'Authorization',
        `Bearer ${res.data.accessToken}`
      );

我在项目2中调用云函数时出现的错误是

https://us-central1-project-2.cloudfunctions.net/project-2-alpha-TestFunction: 401: Unauthorized

您可以简单地在project2 的Cloud Functions 上授予project1 的服务帐户SC。 SP没用,拟人化也!

  • 获取SC邮箱
  • 转到您的 Cloud Functions 列表页面并 select 您的函数(复选框)
    • 点击右上角的“显示信息面板”
    • 将 SC 电子邮件粘贴到会员部分
    • Select Cloud Functions Invoker 作为角色。
  • 保存

就是这样。 您授予项目 1 的 SC,角色 Function.invoker 在项目 2 的 Cloud Functions 级别

这个定义很重要。如果您创建另一个函数,SC 将无法访问它,因为您仅在函数级别授予角色。

如果你想授权访问project2的所有CLoud Function(不推荐),你可以这样做

不要 select 在 project2 中使用您的 Cloud Functions,而是转到 project2 的 IAM 页面(此处您在项目级别)并单击“添加成员”(页面顶部),粘贴SC 电子邮件并添加角色 CLoud FUnction invoker。

我认为至少部分问题是您调用了 IAM 方法: generateAccessToken

获取您的短期令牌,然后在调用 Cloud Function 时将其用作身份验证 header - 但对于调用者 IAM 使用,您需要使用从对[的调用中检索到的 OIDC ID 令牌=12=]

https://cloud.google.com/iam/docs/reference/credentials/rest/v1/projects.serviceAccounts/generateIdToken