

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

# 使用 AWS 适用于 Rust 凭证提供商的 SDK
<a name="credproviders"></a>

 对的所有请求都 AWS 必须使用颁发的凭证进行加密签名。 AWS运行时，SDK 会通过检查多个位置来获取凭证的配置值。

如果检索到的配置包含 [AWS IAM Identity Center 单点登录访问设置](credentials.md)，则 SDK 将与 IAM Identity Center 配合检索用于向 AWS 服务发出请求的临时凭证。

如果检索到的配置包含[临时证书](https://docs.aws.amazon.com/sdkref/latest/guide/access-temp-idc.html)，SDK 将使用它们进行 AWS 服务 调用。临时凭证由访问密钥对和会话令牌组成。

身份验证 AWS 可以在您的代码库之外处理。SDK 可通过凭证提供程序链自动检测、使用并刷新多种身份验证方式。

有关项目 AWS 身份验证入门的指导选项，请参阅[和*工具参考指南中的身份验证AWS SDKs 和*访问权限](https://docs.aws.amazon.com/sdkref/latest/guide/access.html)。

## 凭证提供程序链
<a name="credproviders-default-credentials-provider-chain"></a>

如果您在构建客户端时没有显式指定凭证提供程序，那么适用于 Rust 的 SDK 会使用凭证提供程序链来检查一系列可以提供凭证的位置。SDK 在其中一个位置找到凭证后，搜索就会停止。有关构建客户端的详细信息，请参阅[在代码中为 Rust 服务客户端配置 AWS SDK](config-code.md)。

以下示例未在代码中指定凭证提供程序。SDK 使用凭证提供程序链来检测在托管环境中设置的身份验证，并将该身份验证用于 AWS 服务调用。

```
let config = aws_config::defaults(BehaviorVersion::latest()).load().await;
let s3 = aws_sdk_s3::Client::new(&config);
```

### 凭证检索顺序
<a name="credproviders-credential-retrieval-order"></a>

凭证提供程序链使用以下预定义序列搜索凭证：

1. **访问密钥环境变量**

   SDK 尝试从 `AWS_ACCESS_KEY_ID` 和 `AWS_SECRET_ACCESS_KEY` 以及 `AWS_SESSION_TOKEN` 环境变量加载凭证。

1. **共享的 AWS `config`和`credentials`文件**

   SDK 尝试从共享 AWS `config`和`credentials`文件中的`[default]`配置文件加载凭证。您可以使用 `AWS_PROFILE` 环境变量来选择您想让 SDK 加载的命名配置文件，而不是使用 `[default]`。`config`和`credentials`文件由各种 AWS SDKs 工具共享。有关这些文件的更多信息，请参阅[`config`和*工具参考指南中的共享AWS SDKs 和`credentials`*文件](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。有关可在配置文件中指定的标准化提供商的更多信息，请参阅[AWS SDKs 和工具标准化凭证提供商](https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html)。

1. **AWS STS 网络身份**

   在创建需要访问的移动应用程序或基于客户端的 Web 应用程序时 AWS， AWS Security Token Service (AWS STS) 会为通过公共身份提供商 (IdP) 进行身份验证的联合用户返回一组临时安全证书。
   + 当您在配置文件中指定此项时，SDK 或工具会尝试使用 AWS STS `AssumeRoleWithWebIdentity` API 方法检索临时证书。有关此方法的详细信息，请参阅 *AWS Security Token Service API 参考[AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)*中的。
   +  有关配置此提供程序的指导，请参阅《*和工具参考指南》AWS SDKs 中的* “[使用网络身份进行联合” 或 OpenID](https://docs.aws.amazon.com/sdkref/latest/guide/access-assume-role.html#webidentity) Connect。
   +  有关此提供商的 SDK 配置属性的详细信息，请参阅《工具参考指南》*AWS SDKs 和《工具参考指南*》中的代入[角色凭据提供程序](https://docs.aws.amazon.com/sdkref/latest/guide/feature-assume-role-credentials.html)。

1. **Amazon ECS 和 Amazon EKS 容器凭证**

   您的 Amazon Elastic Container Service 任务和 Kubernetes 服务账户可以具有与其关联的 IAM 角色。在 IAM 角色中授予的权限由任务中运行的容器或容器组（Pod）内的容器承担。此角色允许适用于 Rust 的 SDK 应用程序代码（在容器上）使用其他 AWS 服务。

   SDK 尝试从 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 或 `AWS_CONTAINER_CREDENTIALS_FULL_URI` 环境变量检索凭证，这些变量可以由 Amazon ECS 和 Amazon EKS 自动设置。
   + 有关为 Amazon ECS 设置此角色的详细信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的 [Amazon ECS 任务 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)。
   + 有关 Amazon EKS 的设置信息，请参阅《Amazon EKS 用户指南》****中的[设置 Amazon EKS 容器组身份代理](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-setup.html)。
   +  有关此提供商的 SDK 配置属性的详细信息，请参阅《工具参考指南》*AWS SDKs 和《工具参考指南*》中的[容器凭证提供程序](https://docs.aws.amazon.com/sdkref/latest/guide/feature-container-credentials.html)。

1. **Amazon EC2 实例元数据服务**

   创建 IAM 角色并将其附加到您的实例。实例上适用于 Rust 的 SDK 应用程序会尝试从实例元数据中检索由角色提供的凭证。
   + 适用于 Rust 的软件开发工具包仅支持[IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)。
   + 有关设置此角色和使用元数据的详细信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 的 IAM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)和[使用实例元数据](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)。
   +  有关此提供商的 SDK 配置属性的详细信息，请参阅《工具参考指南》*AWS SDKs 和《工具参考*指南》中的 [IMDS 凭证提供程序](https://docs.aws.amazon.com/sdkref/latest/guide/feature-imds-credentials.html)。

1. 如果此时仍未解析凭证，则操作 panics 会出现错误。

有关 AWS 凭据提供程序配置设置的详细信息，请参阅《*工具*参考指南》的 *“设置” 参考*中的[标准化凭据提供程序](https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html)。AWS SDKs 

## 显式凭证提供程序
<a name="credproviders-explicit-credentials-provider"></a>

您可以指定 SDK 应使用的特定凭证提供程序，而不是依赖凭证提供程序链来检测您的身份验证方法。使用 `aws_config::defaults` 加载常规配置时，您可以指定自定义凭证提供程序，如下所示：

```
let config = aws_config::defaults(BehaviorVersion::latest())
    .credentials_provider(MyCredentialsProvider::new())
    .load()
    .await;
```

您可以通过实现 [https://docs.rs/aws-credential-types/latest/aws_credential_types/provider/trait.ProvideCredentials.html](https://docs.rs/aws-credential-types/latest/aws_credential_types/provider/trait.ProvideCredentials.html) 特性来实施自己的凭证提供程序。

## 身份缓存
<a name="credproviders-identity-caching"></a>

SDK 将缓存凭证和其他身份类型，例如 SSO 令牌。默认情况下，SDK 使用惰性缓存实现：在首次请求时加载凭证并缓存，当凭证即将过期时，会在下次请求时尝试刷新。从同一个 `SdkConfig` 创建的客户端共享一个 [https://docs.rs/aws-smithy-runtime/latest/aws_smithy_runtime/client/identity/struct.IdentityCache.html](https://docs.rs/aws-smithy-runtime/latest/aws_smithy_runtime/client/identity/struct.IdentityCache.html)。