

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

# 設定身分驗證
<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) 是定義工作流程的界面，開發套件會透過此工作流程擷取發起人身分並將其連接至操作請求。

 驗證方案使用下列元件，以下進一步詳細說明：
+  識別方案的唯一 ID 
+  身分解析程式，會傳回用於簽署程序的發起人身分 （例如您的 AWS 登入資料） 
+  簽署者，執行將發起人身分實際注入操作的傳輸請求 （例如 `Authorization` HTTP 標頭） 

 每個服務用戶端選項都包含 `AuthSchemes` 欄位，預設會填入該服務支援的身分驗證方案清單。

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

 每個服務用戶端選項都包含 `AuthSchemeResolver` 欄位。此界面是 SDK 呼叫的 API，用於判斷每個操作的可能身分驗證選項。

**重要**  
 驗證方案解析程式不會指定使用哪個驗證方案。它會傳回*可使用*的方案清單 (「選項」)，最終方案是透過[此處](#auth-scheme-resolution-workflow)所述的固定演算法選取。

### 選項
<a name="option"></a>

 [選項](https://pkg.go.dev/github.com/aws/smithy-go/auth#Option)代表可能的身分驗證選項`ResolverAuthSchemes`，從對 的呼叫傳回。

 選項包含三組資訊：
+  代表可能方案的 ID 
+  要提供給方案身分解析程式的不透明屬性集 
+  要提供給方案簽署者的不透明屬性集 

#### 屬性的備註
<a name="a-note-on-properties"></a>

 對於 99% 的使用案例，發起人不需要擔心身分解析和簽署的不透明屬性。開發套件會提取每個方案的必要屬性，並將其傳遞至開發套件中公開的強類型界面。例如，服務的預設身分驗證解析程式會編碼 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 發起人身分的抽象表示。

 開發套件中使用的最常見身分類型是一組 `aws.Credentials`。對於大多數使用案例，發起人不需要將自己與 `Identity`視為抽象，並且可以直接使用具體類型。

**注意**  
 為了保持回溯相容性並防止 API 混淆， AWS 開發套件特定的身分類型`aws.Credentials`不會直接滿足`Identity`界面。此映射會在內部處理。

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

 [IdentityResolver](https://pkg.go.dev/github.com/aws/smithy-go/auth#IdentityResolver) 是擷取 的界面`Identity`。

 軟體開發套件中`IdentityResolver`存在以強類型形式存在的具體版本 （例如 [aws.CredentialsProvider](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#CredentialsProvider))，軟體開發套件會在內部處理此映射。

 發起人在定義外部身分驗證機制時，只需要直接實作`IdentityResolver`界面。

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

 [Signer](https://pkg.go.dev/github.com/aws/smithy-go/transport/http#Signer) 是請求以擷取呼叫者 補充的界面`Identity`。

 軟體開發套件會以強類型形式 （例如 [v4.HTTPSigner](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/signer/v4#HTTPSigner)) `Signer` 存在於軟體開發套件中的具體版本，軟體開發套件會在內部處理此映射。

 發起人只需要在定義外部身分驗證機制時直接實作`Signer`界面。

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

 每個服務都會接受一組特定的輸入，這些輸入會傳遞至其解析度函數，在每個服務套件中定義為 `AuthResolverParameters`。

 基本解析程式參數如下：


|  name  |  type  |  description  | 
| --- | --- | --- | 
|  Operation  |  string  |  要叫用的 操作名稱。 | 
|  Region  |  string  |  用戶端 AWS 的區域。僅適用於使用 SigV4【A】 的服務。 | 

 如果您要實作自己的解析程式，則永遠不需要建構自己的參數執行個體。開發套件會依請求取得這些值，並將其傳遞給您的實作。

## 驗證方案解析工作流程
<a name="auth-scheme-resolution-workflow"></a>

 當您透過 SDK 呼叫 AWS 服務操作時，請求序列化後會發生下列動作序列：

1.  軟體開發套件會呼叫用戶端的 `AuthSchemeResolver.ResolveAuthSchemes()` API，視需要取得輸入參數，以取得操作的可能[選項](https://pkg.go.dev/github.com/aws/smithy-go/auth#Option)清單。

1.  SDK 會逐一查看該清單，然後選取第一個符合下列條件的方案。
   +  具有相符 ID 的方案存在於用戶端自己的`AuthSchemes`清單中 
   +  方案的身分解析程式存在於 （非`nil`) 用戶端的選項上 （透過方案的 `GetIdentityResolver`方法檢查，對上述具體身分解析程式類型的映射會在內部處理） (1) 

1.  假設已選取可行的方案，開發套件會叫用其 `GetIdentityResolver()` API 來擷取發起人的身分。例如，內建的 SigV4 驗證機制會在內部映射到用戶端的`Credentials`提供者。

1.  SDK 會呼叫身分解析程式的 `GetIdentity()`（例如`aws.CredentialProvider.Retrieve()`，適用於 SigV4)。

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  |  身分解析程式  |  Signer  |  備註  | 
| --- | --- | --- | --- | --- | 
|  [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  |  N/A  |  SigV4A 用量目前受到限制，簽署者實作為內部。請參閱此[公告](https://github.com/aws/aws-sdk-go-v2/discussions/2812)，了解新的選擇加入模組 aws-http-auth，該模組公開用於簽署 HTTP 請求的一般用途 APIs。 | 
|  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 承載器  |  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  |  N/A  |  無  |  無身分驗證 - 不需要身分，且請求未簽署或驗證。 | 

### 身分組態
<a name="identity-configuration"></a>

 在 中 適用於 Go 的 AWS SDK，身分驗證方案的身分元件是在 SDK 用戶端 中設定`Options`。軟體開發套件會自動為呼叫 操作時所選取的配置，挑選並使用這些元件的值。

**注意**  
 基於回溯相容性的原因，如果未設定身分解析程式，開發套件會隱含允許使用匿名身分驗證機制。這可以透過將用戶端 上的所有身分解析程式設定為 `Options``nil`(sigv4 身分解析程式也可以設定為 `aws.AnonymousCredentials{}`) 來手動實現。

### 簽署者組態
<a name="signer-configuration"></a>

 在 中 適用於 Go 的 AWS SDK，身分驗證方案的簽署者元件是在 SDK 用戶端 中設定`Options`。軟體開發套件會自動為呼叫 操作時所選取的配置，挑選並使用這些元件的值。不需要額外的組態。

#### 自訂身分驗證方案
<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`，在適用的情況下`Option`使用結構描述的 ID 傳回身分驗證 

**警告**  
 下列服務具有唯一或自訂的身分驗證行為。如果您需要自訂身分驗證行為，建議您委派 給預設實作，並據此進行包裝：  


|  服務  |  備註  | 
| --- | --- | 
|  S3  |  根據操作輸入，有條件使用 SigV4A 和 SigV4Express。 | 
|  EventBridge  |  根據操作輸入，有條件使用 SigV4A。 | 
|  Cognito  |  某些操作僅限匿名。 | 
|  SSO  |  某些操作僅限匿名。 | 
|  STS  |  某些操作僅限匿名。 | 