

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 中的預設登入資料提供者鏈結 AWS SDK for Java 2.x
<a name="credentials-chain"></a>

中的預設登入資料提供者鏈結 AWS SDK for Java 2.x 會自動在預先定義的位置序列中搜尋 AWS 登入資料，允許應用程式使用 進行身分驗證， AWS 服務 而無需明確指定登入資料來源。

預設憑證提供者鏈由 [DefaultCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html) 類別實作。它會依序委派給其他登入資料提供者實作，以檢查不同位置中的組態。第一個可以尋找所有必要組態元素的登入資料提供者會導致鏈結結束。

若要使用預設登入資料提供者鏈來提供臨時登入資料，請建立服務用戶端建置器，但不指定登入資料提供者。下列程式碼片段會建立`DynamoDbClient`使用預設登入資料提供者鏈結來尋找和擷取組態設定的 。

```
// Any external Region configuration is overridden.
// The SDK uses the default credentials provider chain because no specific credentials provider is specified.
Region region = Region.US_WEST_2;
DynamoDbClient ddb = 
    DynamoDbClient.builder()
                  .region(region)
                  .build();
```

## 登入資料設定擷取順序
<a name="credentials-default"></a>

適用於 Java 的 SDK 2.x 的預設登入資料提供者鏈結會使用預先定義的序列搜尋您環境中的組態。

1. Java 系統屬性
   + SDK 使用 [SystemPropertyCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/SystemPropertyCredentialsProvider.html) 類別從 `aws.accessKeyId`、 `aws.secretAccessKey`和 `aws.sessionToken` Java 系統屬性載入臨時憑證。
**注意**  
如需有關如何設定 Java 系統屬性的資訊，請參閱官方 *Java 教學*課程網站上的[系統屬性](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html)教學課程。

1. 環境變數
   + SDK 使用 [EnvironmentVariableCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/EnvironmentVariableCredentialsProvider.html) 類別從 `AWS_ACCESS_KEY_ID`、 `AWS_SECRET_ACCESS_KEY`和 `AWS_SESSION_TOKEN`環境變數載入臨時憑證。

1. Web 身分字符和 IAM 角色 ARN
   + SDK 使用 [WebIdentityTokenFileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/WebIdentityTokenFileCredentialsProvider.html) 類別，透過使用 Web 身分字符擔任角色來載入憑證。
   + 登入資料提供者會尋找下列環境變數或 JVM 系統屬性：
     + `AWS_WEB_IDENTITY_TOKEN_FILE or aws.webIdentityTokenFile`
     + `AWS_ROLE_ARN` 或 `aws.roleArn`
     + `AWS_ROLE_SESSION_NAME` 或 `aws.roleSessionName`（選用）
   + 開發套件取得值後，它會呼叫 AWS Security Token Service (STS)，並使用其傳回的臨時登入資料來簽署請求。
   + Amazon Elastic Kubernetes Service (EKS) 等執行期環境會自動提供 Web 身分字符給 AWS SDKs，讓應用程式能夠取得臨時 AWS 憑證。

1. 共用 `credentials`和 `config` 檔案
   + SDK 使用 [ProfileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ProfileCredentialsProvider.html) 從共用 `credentials`和 `config` 檔案中的`[default]`設定檔載入 IAM Identity Center 單一登入設定或暫時登入資料。

      AWS SDKs和工具參考指南[提供有關](https://docs.aws.amazon.com/sdkref/latest/guide/understanding-sso.html#idccredres)適用於 Java 的 SDK 如何與 IAM Identity Center 單一登入字符搭配使用的詳細資訊，以取得 SDK 用於呼叫的臨時登入資料 AWS 服務。
**注意**  
`credentials` 和 `config` 檔案由 AWS SDKs和工具共用。如需詳細資訊，請參閱 SDK [和工具參考指南中的 .aws/credentials 和 .aws/config 檔案](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html)。 AWS SDKs 
   + 由於共用`credentials`和`config`檔案中的描述檔可以包含許多不同的設定集，因此`ProfileCredentialsProvider`委派給一系列其他供應商，以在`[default]`描述檔下尋找設定：
     + **Web 身分字符登入**資料 （類別 `WebIdentityTokenCredentialsProvider`)：當設定檔包含 `role_arn`和 時`web_identity_token_file`。
     + **SSO 登入**資料 （類別 `SsoCredentialsProvider`)：當設定檔包含 SSO 相關屬性時，例如 `sso_role_name`、`sso_account_id`。
     + **具有來源描述檔的角色型登入**資料 （類別 `StsAssumeRoleCredentialsProvider`)：當描述檔包含 `role_arn`和 時`source_profile`。
     + **具有登入資料來源的角色型登入**資料 （類別 `StsAssumeRoleWithSourceCredentialsProvider`)：當設定檔包含 `role_arn`和 時`credential_source`。
       + 當 `credential_source = Environment`：它使用 `SystemPropertyCredentialsProvider`和 的鏈 `EnvironmentVariableCredentialsProvider`
       + 當 `credential_source = Ec2InstanceMetadata`：它使用 `InstanceProfileCredentialsProvider`
       + 當 `credential_source = EcsContainer`：它使用 `ContainerCredentialsProvider`
     + **主控台登入憑證** （類別 `LoginCredentialsProvider`)：當設定檔包含 `login_session` 
     + **處理登入**資料 （類別 `ProcessCredentialsProvider`)：當設定檔包含 時`credential_process`。
     + **工作階段登入**資料 （類別 `StaticSessionCredentialsProvider`)：當設定檔包含 `aws_access_key_id`、 `aws_secret_access_key`和 時`aws_session_token`。
     + **基本登入**資料 （類別 `StaticCredentialsProvider`)：當設定檔包含 `aws_access_key_id`和 時`aws_secret_access_key`。

1.  Amazon ECS 容器憑證
   + SDK 使用 [ContainerCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ContainerCredentialsProvider.html) 類別，使用以下環境變數載入臨時憑證：

     1. `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 或 `AWS_CONTAINER_CREDENTIALS_FULL_URI`

     1. `AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE` 或 `AWS_CONTAINER_AUTHORIZATION_TOKEN`

   ECS 容器代理程式會自動設定 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`環境變數，指向 ECS 登入資料端點。其他環境變數通常會在不使用標準 ECS 登入資料端點的特定案例中設定。

1.  Amazon EC2 執行個體 IAM 角色提供的登入資料
   + SDK 使用 [InstanceProfileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/InstanceProfileCredentialsProvider.html) 類別從 Amazon EC2 中繼資料服務載入臨時憑證。

1. 如果軟體開發套件無法透過上述所有步驟找到必要的組態設定，則會擲回例外狀況，其輸出類似如下：

   ```
   software.amazon.awssdk.core.exception.SdkClientException: Unable to load credentials from any of the providers 
   in the chain AwsCredentialsProviderChain(credentialsProviders=[SystemPropertyCredentialsProvider(), 
   EnvironmentVariableCredentialsProvider(), WebIdentityTokenCredentialsProvider(), ProfileCredentialsProvider(), 
   ContainerCredentialsProvider(), InstanceProfileCredentialsProvider()])
   ```

## 在程式碼`DefaultCredentialsProvider`中使用
<a name="default-credentials-provider-in-code"></a>

您可以在程式碼中明確使用預設登入資料提供者鏈結。這功能等同於您完全不指定登入資料提供者，因為軟體開發套件`DefaultCredentialsProvider`預設會使用 。不過，明確使用它可以讓您的程式碼更易於讀取和自我記錄。它清楚地顯示您使用預設登入資料鏈的意圖。

```
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;

public class ExplicitDefaultCredentialsExample {
    public static void main(String[] args) {
        // Explicitly create the DefaultCredentialsProvider.
        DefaultCredentialsProvider defaultCredentialsProvider = DefaultCredentialsProvider
                                                                    .builder().build();

        // Use it with any service client.
        S3Client s3Client = S3Client.builder()
            .region(Region.US_WEST_2)
            .credentialsProvider(defaultCredentialsProvider)
            .build();

        // Now you can use the client with the default credentials chain.
        s3Client.listBuckets();
    }
}
```

當您建置預設登入資料提供者時，您可以提供更多組態：

```
DefaultCredentialsProvider customizedProvider = DefaultCredentialsProvider.builder()
    .profileName("custom-profile")  // Use a specific profile if the chain gets to the `ProfileCredentialsProvider` stage.
    .asyncCredentialUpdateEnabled(true)  // Enable async credential updates.
    .build();
```

此方法可讓您擁有更多控制權，同時仍提供預設登入資料鏈的便利性。