本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
配置身份验证
AWS SDK for Go 提供了配置身份验证行为服务的功能。大多数情况下,默认配置就足够了,但是配置自定义身份验证可支持其他行为,例如使用预发布服务功能。
定义
本节简要介绍了AWS SDK for Go 中的身份验证组件。
AuthScheme
AuthScheme
身份验证方案使用以下组件(详情见下文):
-
唯一 ID(用于标识该方案)
-
身份解析器,负责返回签名过程中使用的调用方身份(例如您的 AWS 凭证)
-
签署人,负责将调用方身份实际注入到操作的传输请求中(例如
AuthorizationHTTP 标头)
每个服务客户端选项都包含一个 AuthSchemes 字段,默认情况下,其中会填充该服务支持的身份验证方案列表。
AuthSchemeResolver
每个服务客户端选项都包含一个 AuthSchemeResolver 字段。这种按服务定义的接口是 SDK 调用的 API,用于确定针对每项操作可能提供的身份验证选项。
重要
身份验证方案解析器并不决定使用哪种身份验证方案。它返回可以使用的方案(“选项”)列表,最终方案是通过此处描述的固定算法选择的。
Option
OptionResolverAuthSchemes 时返回,表示可能的身份验证选项。
一个选项由以下三组信息组成:
-
代表可能方案的 ID
-
将提供给该方案身份解析器的一组不透明属性
-
将提供给方案签署人的一组不透明属性
关于属性的说明
对于 99% 的使用案例,调用方无需关心身份解析和签名的不透明属性。SDK 将提取每种方案的必要属性,并将它们传递给 SDK 中公开的强类型接口。例如,服务的默认身份验证解析器对 SigV4 选项进行编码,使其具有签名名称和区域的签署人属性,当选择 SigV4 时,这些属性的值将传递到客户端已配置的 v4.HTTPSigner
Identity
Identity
SDK 中最常用的身份类型是一组 aws.Credentials。对于大多数使用案例,调用方无需将自己的 Identity 视为抽象概念,可以直接使用具体类型。
注意
为了保持向后兼容性并防止 API 混淆,AWS 特定于 SDK 的身份类型 aws.Credentials 不能直接满足 Identity 接口的要求。此映射的处理是在内部进行。
IdentityResolver
IdentityResolverIdentity 的接口。
IdentityResolver 的具体版本以强类型形式存在于 SDK 中(例如 aws.CredentialsProvider
调用方只需在定义外部身份验证方案时直接实现 IdentityResolver 接口。
Signer
SignerIdentity 来补充请求。
Signer 的具体版本以强类型形式存在于 SDK 中(例如 v4.HTTPSigner
调用方只需在定义外部身份验证方案时直接实现 Signer 接口。
AuthResolverParameters
每项服务都需要一组特定的输入,这些输入将传递给其解析函数,此函数在每个服务包中定义为 AuthResolverParameters。
基本解析器参数如下所示:
| 名称 | 类型 | 描述 |
|---|---|---|
Operation
|
string
|
所调用操作的名称。 |
Region
|
string
|
客户端所在的 AWS 区域。仅适用于使用 SigV4[A] 的服务。 |
如果您要实现自己的解析器,则永远不需要构造自己的参数实例。SDK 将根据每次请求获取这些值,并将其传递给您的实现。
身份验证方案解析工作流程
当您通过 SDK 调用 AWS 服务操作时,在对请求进行序列化后会发生以下一系列操作:
-
SDK 调用客户端的
AuthSchemeResolver.ResolveAuthSchemes()API,根据需要获取输入参数,以获取该操作可能的选项列表。 -
SDK 会遍历该列表,并选择满足以下条件的第一个方案。
-
客户自己的
AuthSchemes列表中存在具有匹配 ID 的方案 -
该方案的身份解析器存在于(非
nil)客户端的选项中(通过方案的GetIdentityResolver方法进行检查,与上述具体身份解析器类型的映射是在内部处理的)(1)
-
-
假设选择了可行的方案,SDK 会调用其
GetIdentityResolver()API 来检索调用方的身份。例如,内置的 SigV4 身份验证方案将在内部映射到客户端的Credentials提供程序。 -
SDK 调用身份解析器的
GetIdentity()(例如 SigV4 的aws.CredentialProvider.Retrieve())。 -
SDK 调用端点解析器的
ResolveEndpoint()来查找请求的端点。端点可能包含影响签名过程的其他元数据(例如 S3 Object Lambda 的唯一签名名称)。 -
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 将自动选取这些组件的值,并将其用于选择的方案。无需进行其他配置。
自定义身份验证方案
为了定义自定义身份验证方案并对其进行配置以供使用,调用方必须执行以下操作:
-
定义 AuthScheme
实现 -
在 SDK 客户端的
AuthSchemes列表中注册该方案 -
在适用的情况下,对 SDK 客户端的
AuthSchemeResolver进行检测,以返回带有方案 ID 的身份验证Option
警告
以下服务具有独特或自定义的身份验证行为。如需自定义身份验证行为,建议您采用默认实现方式并相应地进行包装:
| 服务 | 备注 |
|---|---|
| S3 | 根据操作输入,有条件地使用 SigV4A 和 SigV4Express。 |
| EventBridge | 根据操作输入,有条件地使用 SigV4A。 |
| Cognito | 某些操作只能匿名执行。 |
| SSO | 某些操作只能匿名执行。 |
| STS | 某些操作只能匿名执行。 |