为 Go 设置身份验证

对于打包的 Go 模块的上传和下载,Artifact Registry 的身份验证有所不同。将 Go 模块打包并上传到 Artifact Registry 时,gcloud CLI 工具会在您的环境中查找凭据,以便按以下顺序设置身份验证,除非传递了 --json_key 标志以使用服务帐号密钥。

  1. 应用默认凭据 (ADC) 是一种按以下顺序查找凭据的策略:

    1. GOOGLE_APPLICATION_CREDENTIALS 环境变量中定义的凭据。

    2. Compute Engine、Google Kubernetes Engine、Cloud Run、App Engine 或 Cloud Functions 的默认服务账号提供的凭据。

  2. Google Cloud CLI 提供的凭据,包括命令 gcloud auth application-default login 中的用户凭据。

GOOGLE_APPLICATION_CREDENTIALS 变量会明确指定用于进行身份验证的帐号,从而简化问题排查过程。如果您不使用该变量,请验证 ADC 可能使用的任何帐号是否具有所需的权限。例如,Compute Engine 虚拟机、Google Kubernetes Engine 节点和 Cloud Run 修订版本的默认服务帐号对代码库具有只读权限。如果您打算使用默认服务帐号从这些环境上传内容,则必须修改权限。

从 Artifact Registry 下载打包的 Go 模块以用作依赖项时,Go 二进制文件会使用 .netrc 文件中的凭据向 Artifact Registry 进行身份验证。

.netrc 文件中使用凭据时,Artifact Registry 支持以下身份验证方法:

短期有效凭据(推荐)
使用 Artifact Registry Go 凭据帮助程序工具,使用您环境中的凭据更新 .netrc 文件中的身份验证令牌,或手动将 Artifact Registry 凭据添加到 .netrc 文件中。
使用服务账号密钥
如果您无法在环境中使用凭据进行身份验证,请使用此选项。您可以使用 Artifact Registry Go 凭据帮助程序工具将未加密的服务帐号密钥添加到 .netrc 文件中,也可以手动将其添加到该文件中。

准备工作

  1. 安装 Go 1.15 或更高版本。
  2. 安装 package-go-module gcloud CLI 插件:

    gcloud components install package-go-module

设置 Go 环境

  1. 指示 Go 按以下顺序从 Artifact Registry(公共 Go 模块代理)下载模块,然后下载源代码:

      export GOPROXY=https://LOCATION-go.pkg.dev/PROJECT/REPOSITORY,https://proxy.golang.org,direct
    

    替换以下内容:

    • LOCATION 是代码库的单区域或多区域位置
    • PROJECT 是您的 Google Cloud 项目 ID
    • REPOSITORY 是存储软件包的代码库的名称。
  2. 使用公共校验和数据库将您的模块排除在检查之外:

      export GONOSUMDB=MODULE_PATH_REGEX
    

    如果要排除多个模块,请将 MODULE_PATH_REGEX 替换为您的模块路径或正则表达式。

    例如,要使用公共校验和数据库阻止模块 example.com/foo 检查,请运行以下命令:

      export GONOSUMDB=example.com/foo
    

    以下命令禁止使用公共校验和数据库检查模块路径以 example.com 开头的所有模块:

      export GONOSUMDB=example.com/*
    

将 Artifact Registry 凭据添加到您的 .netrc 文件中

  1. 运行以下命令,使用 Go 凭据帮助程序将 Artifact Registry 凭据添加到 .netrc 文件中:

      GOPROXY=proxy.golang.org \
          go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0 \
          add-locations --locations=LOCATION \
          --json_key=PATH_TO_JSON_KEY
    

    其中:

    • LOCATION 是您的代码库的单区域或多区域位置。如需添加多个位置,请以英文逗号分隔列表的形式输入这些位置。
    • PATH_TO_JSON_KEY(可选)。指向您的服务帐号密钥的路径。

      Go 凭据帮助程序会将用于向 Artifact Registry 进行身份验证的设置添加到 .netrc 文件中。如果您传递 --json_key 标志,系统会将密钥添加到您的 .netrc 文件中,以进行密码身份验证。

  2. 如果您使用短期有效凭据向 Artifact Registry 进行身份验证,则需要在将模块用作依赖项之前运行以下命令来刷新 OAuth 令牌:

      GOPROXY=proxy.golang.org \
      go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0 refresh
    

使用服务账号密钥进行身份验证

当您要求使用用户名和密码进行身份验证时,请使用此方法。

服务账号密钥是长期有效的凭据。请使用以下准则来限制对代码库的访问:

  • 请考虑使用专用服务账号与代码库进行交互。
  • 授予服务账号所需的最低 Artifact Registry 角色。例如,将 Artifact Registry Reader 分配给仅用于下载工件的服务账号。
  • 如果您组织中的群组需要不同级层的访问权限来访问特定代码库,请在代码库级层而不是项目级层授予访问权限。
  • 按照管理凭据的最佳做法操作。

如需配置身份验证,请执行以下操作:

  1. 创建一个服务账号代表您的应用执行操作,或选择一个现有服务账号用于进行自动化。

    您需要服务账号密钥文件所在的位置,才能使用 Artifact Registry 设置身份验证。对于现有账号,您可以在“服务账号”页面上查看密钥和创建新密钥。

    转到“服务账号”页面

  2. 向服务帐号授予适当的 Artifact Registry 角色,以提供代码库访问权限。

  3. 运行以下命令,以使用 Go 凭据帮助程序将您的服务帐号凭据添加到 .netrc 文件中:

      GOPROXY=proxy.golang.org \
          go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0 \
          add-locations --locations=LOCATION \
          --json_key=PATH_TO_JSON_KEY
    

    其中:

    • LOCATION 是您的代码库的单区域或多区域位置。如需添加多个位置,请以英文逗号分隔列表的形式输入这些位置。
    • PATH_TO_JSON_KEY 是服务帐号 JSON 密钥文件的路径。

      Go 凭据帮助程序会将服务帐号密钥添加到 .netrc 文件中,以进行密码身份验证。

您还可以按以下格式手动将服务帐号密钥添加到 .netrc 文件中:

machine LOCATION.pkg.dev
login json_key_base64
password KEY

替换以下内容:

  • LOCATION 替换为您的代码库的单区域或多区域位置
  • KEY 替换为服务帐号密钥文件中的 base64 编码密钥。

将 Go 凭据帮助程序添加到 GONOPROXY

在使用 Go 凭据帮助程序之前,您需要将其添加到 GONOPROXY 列表中,以强制 Go 直接从 GitHub 下载。如果您希望直接从源代码下载其他模块,可以将它们以逗号分隔列表添加,如以下示例所示:

  export GONOPROXY=MODULE_PATH1, MODULE_PATH2

其中,MODULE_PATH1MODULE_PATH2 是要从源代码下载的模块的模块路径。

如需将 Go 凭据帮助程序添加到 GONOPROXY 列表中,并运行它以设置您的凭据,请执行以下操作:

  1. 将 Go 凭据帮助程序添加到 GONOPROXY

      export GONOPROXY=github.com/GoogleCloudPlatform/artifact-registry-go-tools
    
  2. 运行以下命令,使用 Go 模块软件包工具将 Artifact Registry 凭据添加到 .netrc 文件中:

      GOPROXY=proxy.golang.org \
          go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0 \
          add-locations --locations=LOCATION \
          [--json_key=path/to/service/account/key.json]
    

    其中,LOCATION 是代码库的单区域或多区域位置。如需添加多个位置,请以英文逗号分隔列表的形式输入这些位置。

    Go 凭据帮助程序会将用于向 Artifact Registry 进行身份验证的设置添加到 .netrc 文件中。如果您传递 --json_key 标志,系统会将密钥添加到您的 .netrc 文件中以进行密码身份验证。

后续步骤