配置身份验证 - AWS SDK for Go v2

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

配置身份验证

AWS SDK for Go 提供了配置身份验证行为服务的功能。大多数情况下,默认配置就足够了,但是配置自定义身份验证可支持其他行为,例如使用预发布服务功能。

定义

本节简要介绍了AWS SDK for Go 中的身份验证组件。

AuthScheme

AuthScheme 是定义一种工作流程的接口,SDK 通过该工作流程检索调用方身份并将其附加到操作请求。

身份验证方案使用以下组件(详情见下文):

  • 唯一 ID(用于标识该方案)

  • 身份解析器,负责返回签名过程中使用的调用方身份(例如您的 AWS 凭证)

  • 签署人,负责将调用方身份实际注入到操作的传输请求中(例如 Authorization HTTP 标头)

每个服务客户端选项都包含一个 AuthSchemes 字段,默认情况下,其中会填充该服务支持的身份验证方案列表。

AuthSchemeResolver

每个服务客户端选项都包含一个 AuthSchemeResolver 字段。这种按服务定义的接口是 SDK 调用的 API,用于确定针对每项操作可能提供的身份验证选项。

重要

身份验证方案解析器并不决定使用哪种身份验证方案。它返回可以使用的方案(“选项”)列表,最终方案是通过此处描述的固定算法选择的。

Option

Option 是在调用 ResolverAuthSchemes 时返回,表示可能的身份验证选项。

一个选项由以下三组信息组成:

  • 代表可能方案的 ID

  • 将提供给该方案身份解析器的一组不透明属性

  • 将提供给方案签署人的一组不透明属性

关于属性的说明

对于 99% 的使用案例,调用方无需关心身份解析和签名的不透明属性。SDK 将提取每种方案的必要属性,并将它们传递给 SDK 中公开的强类型接口。例如,服务的默认身份验证解析器对 SigV4 选项进行编码,使其具有签名名称和区域的签署人属性,当选择 SigV4 时,这些属性的值将传递到客户端已配置的 v4.HTTPSigner 实现。

Identity

Identity 是对 SDK 调用方身份的抽象表示。

SDK 中最常用的身份类型是一组 aws.Credentials。对于大多数使用案例,调用方无需将自己的 Identity 视为抽象概念,可以直接使用具体类型。

注意

为了保持向后兼容性并防止 API 混淆,AWS 特定于 SDK 的身份类型 aws.Credentials 不能直接满足 Identity 接口的要求。此映射的处理是在内部进行。

IdentityResolver

IdentityResolver 是用于检索 Identity 的接口。

IdentityResolver 的具体版本以强类型形式存在于 SDK 中(例如 aws.CredentialsProvider),SDK 在内部处理此映射。

调用方只需在定义外部身份验证方案时直接实现 IdentityResolver 接口。

Signer

Signer 是一个接口,通过该接口可以用检索到的调用方 Identity 来补充请求。

Signer 的具体版本以强类型形式存在于 SDK 中(例如 v4.HTTPSigner),SDK 在内部处理此映射。

调用方只需在定义外部身份验证方案时直接实现 Signer 接口。

AuthResolverParameters

每项服务都需要一组特定的输入,这些输入将传递给其解析函数,此函数在每个服务包中定义为 AuthResolverParameters

基本解析器参数如下所示:

名称 类型 描述
Operation string 所调用操作的名称。
Region string 客户端所在的 AWS 区域。仅适用于使用 SigV4[A] 的服务。

如果您要实现自己的解析器,则永远不需要构造自己的参数实例。SDK 将根据每次请求获取这些值,并将其传递给您的实现。

身份验证方案解析工作流程

当您通过 SDK 调用 AWS 服务操作时,在对请求进行序列化后会发生以下一系列操作:

  1. SDK 调用客户端的 AuthSchemeResolver.ResolveAuthSchemes() API,根据需要获取输入参数,以获取该操作可能的选项列表。

  2. SDK 会遍历该列表,并选择满足以下条件的第一个方案。

    • 客户自己的 AuthSchemes 列表中存在具有匹配 ID 的方案

    • 该方案的身份解析器存在于(非 nil)客户端的选项中(通过方案的 GetIdentityResolver 方法进行检查,与上述具体身份解析器类型的映射是在内部处理的)(1)

  3. 假设选择了可行的方案,SDK 会调用其 GetIdentityResolver() API 来检索调用方的身份。例如,内置的 SigV4 身份验证方案将在内部映射到客户端的 Credentials 提供程序。

  4. SDK 调用身份解析器的 GetIdentity()(例如 SigV4 的 aws.CredentialProvider.Retrieve())。

  5. SDK 调用端点解析器的 ResolveEndpoint() 来查找请求的端点。端点可能包含影响签名过程的其他元数据(例如 S3 Object Lambda 的唯一签名名称)。

  6. SDK 调用身份验证方案的 Signer() API 来检索其签署人,并通过其 SignRequest() API 使用之前检索的调用方身份对请求进行签名。

(1)如果 SDK 在列表中遇到匿名选项(ID smithy.api#noAuth),则会自动选择该选项,因为没有相应的身份解析器。

原生支持的 AuthScheme

以下身份验证方案由 AWS SDK for Go 原生支持。

名称 方案 ID 身份解析器 签署人 备注
SigV4 aws.auth#sigv4 aws.CredentialsProvider v4.HTTPSigner 大多数 AWS 服务操作的当前默认值。
SigV4A aws.auth#sigv4a aws.CredentialsProvider 不适用 目前 SigV4A 的使用受到限制,签署人实现在内部进行。如需了解新的选择加入模块 aws-http-auth(该模块公开了用于签名 HTTP 请求的通用型 API),请参阅此公告
SigV4Express com.amazonaws.s3#sigv4express s3.ExpressCredentialsProvider v4.HTTPSigner 用于 Express One Zone
HTTP Bearer smithy.api#httpBearerAuth smithybearer.TokenProvider smithybearer.Signer codecatalyst 使用。
匿名 smithy.api#noAuth 不适用 不适用 不使用身份验证 - 不需要身份,也没有对请求进行签名或身份验证。

身份配置

在AWS SDK for Go 中,身份验证方案的身份组件是在 SDK 客户端 Options 中配置的。调用一项操作时,SDK 将自动选取这些组件的值,并将其用于选择的方案。

注意

出于向后兼容性的考虑,如果未配置身份解析器,SDK 会隐式允许使用匿名身份验证方案。这可通过将客户端 Options 上的所有身份解析器设置为 nil(sigv4 身份解析器也可设置为 aws.AnonymousCredentials{})来手动实现。

签署人配置

在AWS SDK for Go 中,身份验证方案的签署人组件是在 SDK 客户端 Options 中配置的。调用一项操作时,SDK 将自动选取这些组件的值,并将其用于选择的方案。无需进行其他配置。

自定义身份验证方案

为了定义自定义身份验证方案并对其进行配置以供使用,调用方必须执行以下操作:

  1. 定义 AuthScheme 实现

  2. 在 SDK 客户端的 AuthSchemes 列表中注册该方案

  3. 在适用的情况下,对 SDK 客户端的 AuthSchemeResolver 进行检测,以返回带有方案 ID 的身份验证 Option

警告

以下服务具有独特或自定义的身份验证行为。如需自定义身份验证行为,建议您采用默认实现方式并相应地进行包装:

服务 备注
S3 根据操作输入,有条件地使用 SigV4A 和 SigV4Express。
EventBridge 根据操作输入,有条件地使用 SigV4A。
Cognito 某些操作只能匿名执行。
SSO 某些操作只能匿名执行。
STS 某些操作只能匿名执行。