

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

# 配置身份验证
<a name="configure-auth"></a>

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

## 定义
<a name="definitions"></a>

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

### AuthScheme
<a name="authscheme"></a>

 [AuthScheme](https://pkg.go.dev/github.com/aws/smithy-go/transport/http#AuthScheme) 是定义一种工作流程的接口，SDK 通过该工作流程检索调用方身份并将其附加到操作请求。

 身份验证方案使用以下组件（详情见下文）：
+  唯一 ID（用于标识该方案） 
+  身份解析器，负责返回签名过程中使用的调用方身份（例如您的 AWS 凭证） 
+  签署人，负责将调用方身份实际注入到操作的传输请求中（例如 `Authorization` HTTP 标头） 

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

### AuthSchemeResolver
<a name="authschemeresolver"></a>

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

**重要**  
 身份验证方案解析器并不决定使用哪种身份验证方案。它返回**可以使用的方案（“选项”）列表，最终方案是通过[此处](#auth-scheme-resolution-workflow)描述的固定算法选择的。

### Option
<a name="option"></a>

 [Option](https://pkg.go.dev/github.com/aws/smithy-go/auth#Option) 是在调用 `ResolverAuthSchemes` 时返回，表示可能的身份验证选项。

 一个选项由以下三组信息组成：
+  代表可能方案的 ID 
+  将提供给该方案身份解析器的一组不透明属性 
+  将提供给方案签署人的一组不透明属性 

#### 关于属性的说明
<a name="a-note-on-properties"></a>

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

### Identity
<a name="identity"></a>

 [Identity](https://pkg.go.dev/github.com/aws/smithy-go/auth#Identity) 是对 SDK 调用方身份的抽象表示。

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

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

### IdentityResolver
<a name="identityresolver"></a>

 [IdentityResolver](https://pkg.go.dev/github.com/aws/smithy-go/auth#IdentityResolver) 是用于检索 `Identity` 的接口。

 `IdentityResolver` 的具体版本以强类型形式存在于 SDK 中（例如 [aws.CredentialsProvider](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#CredentialsProvider)），SDK 在内部处理此映射。

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

### Signer
<a name="signer"></a>

 [Signer](https://pkg.go.dev/github.com/aws/smithy-go/transport/http#Signer) 是一个接口，通过该接口可以用检索到的调用方 `Identity` 来补充请求。

 `Signer` 的具体版本以强类型形式存在于 SDK 中（例如 [v4.HTTPSigner](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/signer/v4#HTTPSigner)），SDK 在内部处理此映射。

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

### AuthResolverParameters
<a name="authresolverparameters"></a>

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

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


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

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

## 身份验证方案解析工作流程
<a name="auth-scheme-resolution-workflow"></a>

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

1.  SDK 调用客户端的 `AuthSchemeResolver.ResolveAuthSchemes()` API，根据需要获取输入参数，以获取该操作可能的[选项](https://pkg.go.dev/github.com/aws/smithy-go/auth#Option)列表。

1.  SDK 会遍历该列表，并选择满足以下条件的第一个方案。
   +  客户自己的 `AuthSchemes` 列表中存在具有匹配 ID 的方案 
   +  该方案的身份解析器存在于（非 `nil`）客户端的选项中（通过方案的 `GetIdentityResolver` 方法进行检查，与上述具体身份解析器类型的映射是在内部处理的）（1） 

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

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

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

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

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

## 原生支持的 `AuthScheme`
<a name="natively-supported-authschemes"></a>

 以下身份验证方案由 适用于 Go 的 AWS SDK 原生支持。


|  名称  |  方案 ID  |  身份解析器  |  签署人  |  备注  | 
| --- | --- | --- | --- | --- | 
|  [SigV4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-signing.html)  |  aws.auth\$1sigv4  |  [aws.CredentialsProvider](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#Credentials)  |  [v4.HTTPSigner](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/signer/v4#Signer)  |  大多数 AWS 服务操作的当前默认值。 | 
|  SigV4A  |  aws.auth\$1sigv4a  |  aws.CredentialsProvider  |  不适用  |  目前 SigV4A 的使用受到限制，签署人实现在内部进行。如需了解新的选择加入模块 aws-http-auth（该模块公开了用于签名 HTTP 请求的通用型 API），请参阅此[公告](https://github.com/aws/aws-sdk-go-v2/discussions/2812)。 | 
|  SigV4Express  |  com.amazonaws.s3\$1sigv4express  |  [s3.ExpressCredentialsProvider](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3#ExpressCredentialsProvider)  |  v4.HTTPSigner  |  用于 [Express One Zone](https://aws.amazon.com/s3/storage-classes/express-one-zone/)。 | 
|  HTTP Bearer  |  smithy.api\$1httpBearerAuth  |  [smithybearer.TokenProvider](https://pkg.go.dev/github.com/aws/smithy-go/auth/bearer#TokenProvider)  |  [smithybearer.Signer](https://pkg.go.dev/github.com/aws/smithy-go/auth/bearer#Signer)  |  由 [codecatalyst](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/codecatalyst) 使用。 | 
|  匿名  |  smithy.api\$1noAuth  |  不适用  |  不适用  |  不使用身份验证 - 不需要身份，也没有对请求进行签名或身份验证。 | 

### 身份配置
<a name="identity-configuration"></a>

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

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

### 签署人配置
<a name="signer-configuration"></a>

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

#### 自定义身份验证方案
<a name="custom-auth-scheme"></a>

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

1.  定义 [AuthScheme](https://pkg.go.dev/github.com/aws/smithy-go/transport/http#AuthScheme) 实现 

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

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

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


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