【问题标题】:Workload identity federation with @google-cloud使用 @google-cloud 进行工作负载身份联合
【发布时间】:2021-10-24 05:44:40
【问题描述】:

当我使用 @google-cloud/storage Node.js 模块 from here ? 我已阅读有关“工作负载身份联合”的信息,但对我来说,当我使用 @google-cloud/storage 库时,我似乎无法使用这种方法。 我找不到任何合适的构造函数,只有这两个:

const {Storage} = require('@google-cloud/storage');
var storage = new Storage({
  projectId   : `my_google_project_id`,
  keyFilename : `my_google_key_file.json`   // service account key is inside of this file
});
// or this one:
var storage = new Storage();    // service account key is inside of file specified by environment variable GOOGLE_APPLICATION_CREDENTIALS

有什么建议吗? 谢谢

【问题讨论】:

  • 您从哪里尝试使用工作负载身份联合?

标签: node.js google-cloud-storage workload-identity


【解决方案1】:

大多数 Google 客户端都支持类型为 external_account 的新密钥文件。下面演示如何创建此文件并设置应用程序默认凭据 (ADC) 以加载此文件。

要将 Workload Identity Federation 与 Google 客户端库一起使用,请将联合凭据保存到文件中,然后通过环境变量 GOOGLE_APPLICATION_CREDENTIALS 指定该文件。存储客户端将使用 ADC 并从环境中找到凭据。

AWS 示例:

# Generate an AWS configuration file.
gcloud iam workload-identity-pools create-cred-config \
    projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$POOL_ID/providers/$AWS_PROVIDER_ID \
    --service-account $SERVICE_ACCOUNT_EMAIL \
    --aws \
    --output-file /path/to/generated/config.json

Azure 示例:

# Generate an Azure configuration file.
gcloud iam workload-identity-pools create-cred-config \
    projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$POOL_ID/providers/$AZURE_PROVIDER_ID \
    --service-account $SERVICE_ACCOUNT_EMAIL \
    --azure \
    --output-file /path/to/generated/config.json

注意:我在 Azure VM 上生成了我的凭据。我在上面的命令中添加了以下命令行选项:

--app-id-uri=https://iam.googleapis.com/projects/REDACTED/locations/global/workloadIdentityPools/pool-azure/providers/provider-id

output-file 值用于设置环境:

set GOOGLE_APPLICATION_CREDENTIALS=/path/to/generated/config.json

文件具有以下结构。此示例适用于 Azure:

{
  "type": "external_account",
  "audience": "//iam.googleapis.com/projects/REDACTED/locations/global/workloadIdentityPools/pool-azure/providers/provider-id",
  "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
  "token_url": "https://sts.googleapis.com/v1/token",
  "credential_source": {
    "url": "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://iam.googleapis.com/projects/REDACTED/locations/global/workloadIdentityPools/pool-azure/providers/provider-id",
    "headers": {
      "Metadata": "True"
    },
    "format": {
      "type": "json",
      "subject_token_field_name": "access_token"
    }
  },
  "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/REDACTED@REDACTED.iam.gserviceaccount.com:generateAccessToken"
}

使用此样式创建客户端:

var storage = new Storage();

【讨论】:

  • 谢谢。据我了解,您所提到的只是“作为服务帐户进行身份验证”并描述为here。而所有这些都需要物理文件。我不想将服务密钥文件保存为文件。 :) 我正在寻找一种解决方案,我可以将所有这些值(位于文件内部)作为参数传递给 lib。我的申请是“完全在本地”。没有 AWS,没有 Azure 等。
  • @VladimirPimtchenkov - 如果您不使用 AWS 或 Azure,那么您使用 Workload Identity Federation 做什么?
  • 我正在尝试找出在不使用服务密钥文件的情况下获得 Google Cloud Storage 授权的方式,我认为 Workload Identity Federation 可以满足我的需求。跨度>
  • 我也了解 Workload Identity Federation 使用 ID 令牌,而不是凭证文件。我可以生成我需要的 JWT 令牌,但如何在我的应用程序代码中使用它向 Google Cloud Storage 进行身份验证?
  • @Zaffer - 不要在 cmets 部分提出新问题。创建一个新问题,以便每个人都能看到该问题。
猜你喜欢
  • 1970-01-01
  • 2021-01-23
  • 2022-11-11
  • 2021-10-07
  • 2020-05-08
  • 1970-01-01
  • 2021-09-01
  • 2018-12-29
  • 1970-01-01
相关资源
最近更新 更多