

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

# 使用 Amazon Cognito 使用者集區進行身分驗證
<a name="authentication"></a>

Amazon Cognito 包含幾種對您的使用者進行身分驗證的方法。使用者可以使用密碼和 WebAuthn 通行金鑰登入。Amazon Cognito 可以在電子郵件或簡訊中傳送一次性密碼給他們。您可以實作 Lambda 函數來協調自己的一系列挑戰和回應。這些是*身分驗證流程*。在身分驗證流程中，使用者提供秘密，Amazon Cognito 會驗證秘密，然後發出 JSON Web 字符 (JWTs) 供應用程式使用 OIDC 程式庫處理。在本章中，我們將討論如何在各種應用程式環境中為各種身分驗證流程設定使用者集區和應用程式用戶端。您將了解使用受管登入託管登入頁面的選項，以及在 AWS SDK 中建置自己的邏輯和前端。

所有使用者集區 (無論您是否擁有網域) 都可以在使用者集區 API 中對使用者進行身分驗證。如果您將網域新增至使用者集區，則可以使用[使用者集區端點](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html)。使用者集區 API 支援各種授權模型和 API 請求的請求流程。

為了驗證使用者的身分，Amazon Cognito 支援除了電子郵件和簡訊一次性密碼和通行金鑰等密碼之外，還包含挑戰類型的身分驗證流程。

**Topics**
+ [實作身分驗證流程](#authentication-implement)
+ [使用使用者集區進行身分驗證的須知事項](#authentication-flow-things-to-know)
+ [範例身分驗證工作階段](#amazon-cognito-user-pools-authentication-flow)
+ [設定受管登入的身分驗證方法](authentication-flows-selection-managedlogin.md)
+ [管理 AWS SDKs驗證方法](authentication-flows-selection-sdk.md)
+ [身分驗證流程](amazon-cognito-user-pools-authentication-flow-methods.md)
+ [API 和 SDK 身分驗證的授權模型](authentication-flows-public-server-side.md)

## 實作身分驗證流程
<a name="authentication-implement"></a>

無論您是實作[受管登入](authentication-flows-selection-managedlogin.md)，還是使用 AWS 開發套件進行身分驗證[的自訂建置應用程式前端](authentication-flows-selection-sdk.md)，都必須為您要實作的身分驗證類型設定應用程式用戶端。下列資訊說明[應用程式用戶端](user-pool-settings-client-apps.md)和應用程式中身分驗證流程的設定。

------
#### [ App client supported flows ]

您可以在 Amazon Cognito 主控台或使用 AWS SDK 中的 API，為您的應用程式用戶端設定支援的流程。將應用程式用戶端設定為支援這些流程之後，您可以在應用程式中部署它們。

下列程序會使用 Amazon Cognito 主控台設定應用程式用戶端的可用身分驗證流程。

**為身分驗證流程設定應用程式用戶端 （主控台）**

1. 登入 AWS 並導覽至 [Amazon Cognito 使用者集區主控台](https://console.aws.amazon.com/cognito/v2/idp)。選擇使用者集區或建立新的集區。

1. 在您的使用者集區組態中，選取**應用程式用戶端**選單。選擇應用程式用戶端或建立新的用戶端。

1. 在**應用程式用戶端資訊**下，選取**編輯**。

1. 在**應用程式用戶端流程**下，選擇您要支援的身分驗證流程。

**設定應用程式用戶端進行身分驗證流程 (API/SDK)**  
若要使用 Amazon Cognito API 設定應用程式用戶端的可用身分驗證流程，請在 [CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html#CognitoUserPools-CreateUserPoolClient-request-ExplicitAuthFlows) 或 [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html#CognitoUserPools-UpdateUserPoolClient-request-ExplicitAuthFlows) 請求`ExplicitAuthFlows`中設定 的值。以下是向用戶端佈建安全遠端密碼 (SRP) 和以選擇為基礎的身分驗證的範例。

```
"ExplicitAuthFlows": [ 
   "ALLOW_USER_AUTH",
   "ALLOW_USER_SRP_AUTH
]
```

當您設定應用程式用戶端支援的流程時，您可以指定下列選項和 API 值。


**應用程式用戶端流程支援**  

| 身分驗證流程 | 相容性 | 主控台 | API  | 
| --- | --- | --- | --- | 
| [選擇型身分驗證](authentication-flows-selection-sdk.md#authentication-flows-selection-choice) | 伺服器端、用戶端 | 在登入時選取身分驗證類型 | ALLOW\$1USER\$1AUTH | 
| [使用持久性密碼登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-password) | 用戶端 | 使用使用者名稱和密碼登入 | ALLOW\$1USER\$1PASSWORD\$1AUTH | 
| [使用持久性密碼和安全承載登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp) | 伺服器端、用戶端 | 使用安全遠端密碼 (SRP) 登入 | ALLOW\$1USER\$1SRP\$1AUTH | 
| [重新整理權杖](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-refresh) | 伺服器端、用戶端 | 從現有的已驗證工作階段取得新的使用者字符 | ALLOW\$1REFRESH\$1TOKEN\$1AUTH | 
| [伺服器端身分驗證](authentication-flows-public-server-side.md#amazon-cognito-user-pools-server-side-authentication-flow) | 伺服器端 | 使用伺服器端管理登入資料登入 | ALLOW\$1ADMIN\$1USER\$1PASSWORD\$1AUTH | 
| [自訂身分驗證](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-custom) | 伺服器端和用戶端自訂建置的應用程式。與受管登入不相容。 | 使用來自 Lambda 觸發程序的自訂身分驗證流程登入 | ALLOW\$1CUSTOM\$1AUTH | 

------
#### [ Implement flows in your application ]

受管登入會自動在登入頁面中提供您設定的身分驗證選項。在自訂建置的應用程式中，使用初始流程的宣告開始身分驗證。
+ 若要從使用者的流程選項清單中選擇，請使用`USER_AUTH`流程宣告以[選擇為基礎的身分驗證](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)。此流程具有用戶端型身分驗證流程中無法使用的可用身分驗證方法，例如[通行金鑰](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passkey)和[無密碼](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)身分驗證。
+ 若要選擇您的身分驗證流程，請使用應用程式[用戶端中可用的任何其他流程宣告用戶端型身分驗證](authentication-flows-selection-sdk.md#authentication-flows-selection-client)。

當您登入使用者時，[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthFlow) 或 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-AuthFlow) 請求的內文必須包含 `AuthFlow` 參數。

以選擇為基礎的身分驗證：

```
"AuthFlow": "USER_AUTH"
```

使用 SRP 的用戶端型身分驗證：

```
"AuthFlow": "USER_SRP_AUTH"
```

------

## 使用使用者集區進行身分驗證的須知事項
<a name="authentication-flow-things-to-know"></a>

在設計具有 Amazon Cognito 使用者集區的身分驗證模型時，請考慮以下資訊。

**受管登入和託管 UI 中的身分驗證流程**  
相較於傳統託管 UI，[受管登入](cognito-user-pools-managed-login.md)有更多的身分驗證選項。例如，使用者只能在受管登入中執行無密碼和通行金鑰身分驗證。

**自訂身分驗證流程僅適用於 AWS SDK 身分驗證**  
您無法使用受管登入或傳統託管 UI 執行*自訂身分驗證流程*，或使用 [Lambda 觸發程序進行自訂身分驗證](user-pool-lambda-challenge.md)。自訂身分驗證可在[使用 AWS SDKs身分驗證](authentication-flows-selection-sdk.md)中使用。

**外部身分提供者 (IdP) 登入的受管登入**  
您無法透過[使用 AWS SDKs 進行身分驗證](authentication-flows-selection-sdk.md)[中的第三方 IdPs](cognito-user-pools-identity-federation.md) 登入使用者。您必須實作受管登入或傳統託管 UI、重新導向至 IdPs，然後在應用程式中使用 OIDC 程式庫處理產生的身分驗證物件。如需受管登入的詳細資訊，請參閱 [使用者集區受管登入](cognito-user-pools-managed-login.md)。

**無密碼身分驗證對其他使用者功能的影響**  
在您的使用者集區和應用程式用戶端中使用[一次性密碼](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)或[通行金鑰](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passkey)啟用無密碼登入，會影響使用者建立和遷移。當無密碼登入處於作用中狀態時：  

1. 管理員可以建立沒有密碼的使用者。預設邀請訊息範本會變更為不再包含`{###}`密碼預留位置。如需詳細資訊，請參閱[建立使用者帳戶為管理員](how-to-create-user-accounts.md)。

1. 對於以 SDK 為基礎的 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) 操作，使用者註冊時不需要提供密碼。受管登入和託管 UI 在註冊頁面中需要密碼，即使允許無密碼身分驗證。如需詳細資訊，請參閱[註冊及確認使用者帳戶](signing-up-users-in-your-app.md)。

1. 如果從 CSV 檔案匯入的使用者的屬性包含可用的無密碼登入選項的電子郵件地址或電話號碼，則可以使用無密碼選項立即登入，而無需重設密碼。如需詳細資訊，請參閱[從 CSV 檔案將使用者匯入使用者集區](cognito-user-pools-using-import-tool.md)。

1. 無密碼身分驗證不會叫用[使用者遷移 Lambda 觸發](user-pool-lambda-migrate-user.md)程序。

1. 使用一次性密碼 (OTP) 第一要素登入的使用者無法將[多重要素驗證 (MFA)](user-pool-settings-mfa.md) 要素新增至其工作階段。使用 設定時，具有使用者驗證的通行金鑰可以滿足 MFA 要求`MULTI_FACTOR_WITH_USER_VERIFICATION`。

**通行密鑰依賴方 URLs 不能在公有字尾清單中**  
您可以使用您擁有的網域名稱，例如 `www.example.com`，做為通行金鑰組態中的依賴方 (RP) ID。此組態旨在支援在您擁有的網域上執行的自訂建置應用程式。[公有字尾清單](https://publicsuffix.org/)或 PSL 包含受保護的高階網域。當您嘗試將 RP URL 設定為 PSL 上的網域時，Amazon Cognito 會傳回錯誤。

**Topics**
+ [身分驗證工作階段流程持續時間](#authentication-flow-session-duration)
+ [失敗登入嘗試的鎖定行為](#authentication-flow-lockout-behavior)

### 身分驗證工作階段流程持續時間
<a name="authentication-flow-session-duration"></a>

視使用者集區的功能而定，在應用程式從 Amazon Cognito 擷取字符`RespondToAuthChallenge`之前`InitiateAuth`，您最終可以回應多個挑戰。Amazon Cognito 會在每個請求的回應中包含一個工作階段字串。如要將您的 API 請求合併至身分驗證流程中，請在每個後續請求中包含來自上一個請求回應的工作階段字串。依預設，您的使用者在工作階段字串到期前，有三分鐘的時間完成每項挑戰。如要調整此期間，請變更您的應用程式用戶端**身分驗證流程工作階段持續時間**。下列程序說明如何在應用程式用戶端設定中變更此設定。

**注意**  
**身分驗證流程工作階段持續時間** 設定適用於 Amazon Cognito 使用者集區 API 的身份驗證。受管登入會將多因素身分驗證的工作階段持續時間設定為 3 分鐘，密碼重設碼則為 8 分鐘。

------
#### [ Amazon Cognito console ]

**設定應用程式用戶端驗證流程工作階段持續時間 (AWS 管理主控台)**

1. 在使用者集區的 **App integration** (應用程式整合) 索引標籤，選取 **App clients and analytics** (應用程式用戶端和分析) 容器的應用程式用戶端名稱。

1. 在 **應用程式用戶端資訊** 容器中選擇 **編輯**。

1. 對於簡訊和電子郵件 MFA 代碼，將**身分驗證流程工作階段持續時間**的值變更為您想要的有效持續時間，以分鐘為單位。這也會改變任何使用者在應用程式用戶端中完成任何驗證挑戰的時間長度。

1. 選擇**儲存變更**。

------
#### [ User pools API ]

**設定應用程式用戶端驗證流程工作階段持續時間 (Amazon Cognito API)**

1. 使用 `DescribeUserPoolClient` 請求中現有的使用者集區設定來準備 `UpdateUserPoolClient` 請求。您的 `UpdateUserPoolClient` 請求必須包含所有現有的應用程式用戶端屬性。

1. 將 `AuthSessionValidity` 的值變更為您要的 SMS MFA 代碼的有效期限 (以分鐘為單位)。這也會改變任何使用者在應用程式用戶端中完成任何驗證挑戰的時間長度。

------

如需應用程式用戶端的詳細資訊，請參閱 [使用應用程式用戶端的應用程式特定設定](user-pool-settings-client-apps.md)。

### 失敗登入嘗試的鎖定行為
<a name="authentication-flow-lockout-behavior"></a>

使用使用者密碼嘗試登入失敗五次後，無論這些嘗試是使用未經驗證或 IAM 授權的 API 操作請求，Amazon Cognito 都會將您的使用者鎖定一秒鐘。然後，鎖定持續時間會在每增加一次失敗嘗試後加倍，最多可達約 15 分鐘。

在鎖定期間進行的嘗試會產生 `Password attempts exceeded` 例外狀況，並且不會影響後續鎖定期間的持續時間。對於嘗試登入失敗的累計次數 *n* (不包括 `Password attempts exceeded` 例外狀況)，Amazon Cognito 會將您的使用者鎖定 *2^(n-5)* 秒。若要將鎖定重設為 *n=0* 初始狀態，您的使用者必須在鎖定期間過後成功登入，或是在鎖定後連續 15 分鐘內不得進行任何登入嘗試。此行為可能會有所變更。此行為不適用於自訂挑戰，除非該挑戰也執行以密碼為基礎的身份驗證。

## 範例身分驗證工作階段
<a name="amazon-cognito-user-pools-authentication-flow"></a>

下圖和step-by-step指南說明使用者登入應用程式的典型案例。範例應用程式會向使用者提供數個登入選項。他們透過輸入登入資料、提供額外的身分驗證因素並登入來選取一個。

![\[流程圖顯示應用程式，提示使用者輸入並使用 AWS SDK 登入。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/authentication-api-userauth.png)


使用登入頁面來映射應用程式，使用者可以使用使用者名稱和密碼登入、在電子郵件訊息中請求一次性代碼，或選擇指紋選項。

1. **登入提示**：您的應用程式會顯示含有*登入*按鈕的主畫面。

1. **請求登入**：使用者選取*登入*。從 Cookie 或快取中，您的應用程式會擷取其使用者名稱，或提示他們輸入。

1. **請求選項**：您的應用程式會使用`USER_AUTH`流程的 `InitiateAuth` API 請求請求使用者的登入選項，為使用者請求可用的登入方法。

1. **傳送登入選項**：Amazon Cognito 以 `PASSWORD`、 `EMAIL_OTP`和 回應`WEB_AUTHN`。回應包含工作階段識別符，可讓您在下一個回應中重播。

1. **顯示選項**：您的應用程式會顯示使用者輸入使用者名稱和密碼、取得一次性代碼或掃描指紋的 UI 元素。

1. **選擇選項/輸入登入**資料：使用者輸入使用者名稱和密碼。

1. **啟動身分驗證**：您的應用程式會使用 `RespondToAuthChallenge` API 請求來提供使用者的登入資訊，以確認使用者名稱-密碼登入，並提供使用者名稱和密碼。

1. **驗證登入**資料：Amazon Cognito 會確認使用者的登入資料。

1. **其他挑戰**：使用者已使用驗證器應用程式設定多重要素驗證。Amazon Cognito 傳回`SOFTWARE_TOKEN_MFA`挑戰。

1. **挑戰提示**：您的應用程式會顯示從使用者的驗證器應用程式請求以時間為基礎的一次性密碼 (TOTP) 的表單。

1. **答案挑戰**：使用者提交 TOTP。

1. **回應挑戰**：在另一個`RespondToAuthChallenge`請求中，您的應用程式會提供使用者的 TOTP。

1. **驗證挑戰回應**：Amazon Cognito 會確認使用者的程式碼，並判斷您的使用者集區已設定為不會對目前使用者發出其他挑戰。

1. **問題字符**：Amazon Cognito 會傳回 ID、存取和重新整理 JSON Web 字符 JWTs)。使用者的初始身分驗證已完成。

1. **存放權杖**：您的應用程式會快取使用者的權杖，以便其可以參考使用者資料、授權存取資源，並在權杖過期時更新權杖。

1. **轉譯授權內容**：您的應用程式會根據使用者的身分和角色來決定使用者的 資源存取權，並交付應用程式內容。

1. **存取內容**：使用者已登入並開始使用應用程式。

1. **使用過期權杖請求內容**：稍後，使用者會請求需要授權的資源。使用者的快取字符已過期。

1. **重新整理權杖**：您的應用程式使用使用者儲存的重新整理權杖提出`InitiateAuth`請求。

1. **問題字符**：Amazon Cognito 會傳回新 ID 並存取 JWTs。使用者的工作階段會安全地重新整理，而不需要額外的登入資料提示。

您可以使用[AWS Lambda 觸發來](cognito-user-pools-working-with-lambda-triggers.md)自訂使用者驗證的方式。這些觸發會發出並驗證自身的挑戰做為驗證流程的一部分。

您也可以針對安全的後端伺服器使用系統管理員驗證流程。您可以使用[使用者遷移身分驗證流程](cognito-user-pools-using-import-tool.md)來讓使用者遷移成為可能，而無需您的使用者重設密碼。

# 設定受管登入的身分驗證方法
<a name="authentication-flows-selection-managedlogin"></a>

當您想要使用者登入、登出或重設密碼時，您可以叫用[受管登入頁面](cognito-user-pools-managed-login.md)，也就是用於使用者集區身分驗證的 Web 前端。在此模型中，您的應用程式會匯入 OIDC 程式庫，以使用使用者集區受管登入頁面處理瀏覽器型身分驗證嘗試。使用者可用的身分驗證形式取決於使用者集區和應用程式用戶端的組態。在您的應用程式用戶端中實作`ALLOW_USER_AUTH`流程，Amazon Cognito 會提示使用者從可用的選項中選取登入方法。實作`ALLOW_USER_PASSWORD_AUTH`並指派 SAML 供應商，您的登入頁面會提示使用者輸入使用者名稱和密碼，或與其 IdP 連線。

Amazon Cognito 使用者集區主控台可協助您開始設定應用程式的受管登入身分驗證。當您建立新的使用者集區時，請指定您要開發的平台，主控台會提供範例，讓您實作具有入門程式碼的 OIDC 和 OAuth 程式庫，以實作登入和登出流程。您可以使用許多 OIDC 依賴方實作來建置受管登入。我們建議您盡可能使用[經認證的 OIDC 依賴方程式庫](https://openid.net/developers/certified-openid-connect-implementations/)。如需詳細資訊，請參閱[使用者集區入門](getting-started-user-pools.md)。

一般而言，OIDC 依賴方程式庫會定期檢查使用者集區的`.well-known/openid-configuration`端點，以判斷發行者 URLs例如字符端點和授權端點。最佳實務是，在您可以選擇的地方實作此自動探索行為。手動設定發行者端點可能會導致錯誤。例如，您可以變更使用者集區網域。的路徑`openid-configuration`不會連結至您的使用者集區網域，因此自動探索服務端點的應用程式會自動取得您的網域變更。

## 受管登入的使用者集區設定
<a name="authentication-flows-selection-managedlogin-settings"></a>

您可能想要允許使用應用程式的多個供應商登入，或者您可能想要使用 Amazon Cognito 做為獨立的使用者目錄。您也可以收集使用者屬性、設定和提示 MFA，或要求電子郵件地址做為使用者名稱。您無法直接編輯受管登入和託管 UI 中的欄位。反之，使用者集區的組態會自動設定受管登入身分驗證流程的處理。

下列使用者集區組態項目會決定 Amazon Cognito 在受管登入和託管 UI 中呈現給使用者的身分驗證方法。

------
#### [ User pool options (Sign-in menu) ]

下列選項位於 Amazon Cognito 主控台中使用者集區的**登入**選單中。

**Cognito 使用者集區登入選項**  
有使用者名稱的選項。您的受管登入和託管 UI 頁面僅接受您所選取格式的使用者名稱。例如，當您使用**電子郵件**作為唯一登入選項設定使用者集區時，您的受管登入頁面只會接受電子郵件格式的使用者名稱。

**必要屬性**  
當您在使用者集區中視需要設定屬性時，受管登入會在使用者註冊時提示使用者該屬性的值。

**選擇型的登入選項**  
在 中具有身分驗證方法的設定[選擇型身分驗證](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)。在這裡，您可以開啟或關閉身分驗證方法，例如[通行金鑰](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passkey)和[無密碼](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)。這些方法僅適用於具有 **Lite** 層以上[受管登入網域](managed-login-branding.md)和[功能計劃](cognito-sign-in-feature-plans.md)的使用者集區。

**多重要素驗證**  
受管登入和託管 UI 會處理 [MFA](user-pool-settings-mfa.md) 的註冊和身分驗證操作。當您的使用者集區需要 MFA 時，您的登入頁面會自動提示使用者設定其額外因素。他們也會提示具有 MFA 組態的使用者使用 MFA 程式碼完成身分驗證。當您的使用者集區中的 MFA 關閉或選用時，您的登入頁面不會提示設定 MFA。

**使用者帳戶復原**  
使用者集區的自助式[帳戶復原]()設定會決定您的登入頁面是否顯示使用者可重設密碼的連結。

------
#### [ User pool options (Domain menu) ]

下列選項位於 Amazon Cognito 主控台中使用者集區的**網域**選單中。

**網域**  
您選擇的使用者集區網域會設定使用者在叫用其瀏覽器進行身分驗證時所開啟連結的路徑。

**品牌版本**  
您選擇的品牌版本會決定您的使用者集區網域是否顯示受管登入或託管 UI。

------
#### [ User pool options (Social and external providers menu) ]

下列選項位於 Amazon Cognito 主控台中使用者集區的**社交和外部提供者**選單中。

**供應商**  
您新增至使用者集區的身分提供者 (IdPs) 可為使用者集區中的每個應用程式用戶端保持作用中或非作用中狀態。

------
#### [ App client options ]

下列選項位於 Amazon Cognito 主控台中使用者集區的**應用程式用戶端**選單中。若要檢閱這些選項，請從清單中選擇應用程式用戶端。

**快速設定指南**  
快速設定指南具有適用於各種開發人員環境的程式碼範例。它們包含將受管登入身分驗證與您的應用程式整合所需的程式庫。

**應用程式用戶端資訊**  
編輯此組態，為目前應用程式用戶端表示的應用程式設定指派的 IdPs。在受管登入頁面上，Amazon Cognito 會顯示使用者的選擇。這些選擇取決於指派的方法和 IdP。例如，如果您指派名為 `MySAML`和本機使用者集區登入的 SAML 2.0 IdP，您的受管登入頁面會顯示身分驗證方法提示和 的按鈕`MySAML`。

**身分驗證設定**  
編輯此組態，為您的應用程式設定身分驗證方法。在受管登入頁面上，Amazon Cognito 會顯示使用者的選擇。這些選擇取決於使用者集區做為 IdP 的可用性，以及您指派的方法。例如，如果您指派以選擇為基礎的`ALLOW_USER_AUTH`身分驗證，您的受管登入頁面會顯示可用的選項，例如輸入電子郵件地址並使用通行金鑰登入。受管登入頁面也會轉譯所指派 IdPs按鈕。

**登入頁面**  
使用此索引標籤中可用的選項，設定受管登入或託管 UI 使用者互動頁面的視覺化效果。如需詳細資訊，請參閱[將品牌套用到受管登入頁面](managed-login-branding.md)。

------

# 管理 AWS SDKs驗證方法
<a name="authentication-flows-selection-sdk"></a>

Amazon Cognito 使用者集區中的使用者可以使用各種初始登入選項或*因素*登入。對於某些因素，使用者可以使用多重要素驗證 (MFA) 進行追蹤。這些首要因素包括使用者名稱和密碼、一次性密碼、通行密鑰和自訂身分驗證。如需詳細資訊，請參閱[身分驗證流程](amazon-cognito-user-pools-authentication-flow-methods.md)。當您的應用程式具有內建 UI 元件並匯入 AWS SDK 模組時，您必須建置應用程式邏輯以進行身分驗證。您必須從兩種主要方法中選擇一種，並從該方法中選擇您要實作的身分驗證機制。

您可以實作以*用戶端為基礎的身分驗證*，其中您的應用程式或用戶端會事先宣告身分驗證的類型。您的另一個選項是*選擇型身分驗證*，您的應用程式會收集使用者名稱，並請求使用者可用的身分驗證類型。您可以根據您的需求，在相同的應用程式中一起實作這些模型，或在應用程式用戶端之間分割。每個方法都有其獨有的功能，例如以用戶端為基礎的自訂身分驗證和以選擇為基礎的無密碼身分驗證。

在使用使用者集區 API 的 AWS SDK 實作執行身分驗證的自訂應用程式中，您必須建構 API 請求，以符合使用者集區組態、應用程式用戶端組態和用戶端偏好設定。以 `AuthFlow`的 開頭的`InitiateAuth`工作階段會`USER_AUTH`開始以選擇為基礎的身分驗證。Amazon Cognito 會以偏好的身分驗證方法或選項清單的挑戰來回應您的 API。以 開頭`AuthFlow`的工作階段`CUSTOM_AUTH`會直接使用 Lambda 觸發程序進行自訂身分驗證。

有些身分驗證方法固定為兩種流程類型的其中之一，而有些方法在這兩種流程中都可用。

**Topics**
+ [選擇型身分驗證](#authentication-flows-selection-choice)
+ [用戶端型身分驗證](#authentication-flows-selection-client)

## 選擇型身分驗證
<a name="authentication-flows-selection-choice"></a>

您的應用程式可以在以選擇為基礎的身分驗證中請求下列身分驗證方法。在 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthParameters) 或 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-AuthParameters) 的 `PREFERRED_CHALLENGE` 參數中宣告這些選項，或在 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html#CognitoUserPools-RespondToAuthChallenge-request-ChallengeName) 或 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html#CognitoUserPools-AdminRespondToAuthChallenge-request-ChallengeName) 的 `ChallengeName` 參數中宣告這些選項。

1. `EMAIL_OTP` 和 `SMS_OTP`

   [使用一次性密碼的無密碼登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)

1. `WEB_AUTHN`

   [使用 WebAuthn 通行金鑰進行無密碼登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passkey)

1. `PASSWORD`

   [使用持久性密碼登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-password)

   [使用持久性密碼和安全承載登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp)

   [登入後的 MFA](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-mfa)

若要在其 API 內容中檢閱這些選項，請參閱 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html#CognitoUserPools-RespondToAuthChallenge-request-ChallengeName) `ChallengeName`中的 。

以選擇為基礎的登入會發出挑戰來回應您的初始請求。此挑戰會驗證請求的選項是否可用，或提供可用的選項清單。您的應用程式可以向使用者顯示這些選擇，然後輸入他們偏好登入方法的登入資料，並在挑戰回應中繼續進行身分驗證。

您可以在身分驗證流程中使用下列以選擇為基礎的選項。此類型的所有請求都需要您的應用程式先收集使用者名稱，或從快取中擷取。

1. `USERNAME` 僅請求具有 `AuthParameters`的 選項。Amazon Cognito 傳回`SELECT_CHALLENGE`挑戰。從那裡，您的應用程式可以提示使用者選取挑戰，並將此回應傳回至您的使用者集區。

1. 請求使用 `AuthParameters`的偏好挑戰`PREFERRED_CHALLENGE`，以及偏好挑戰的參數，如果有的話。例如，如果您請求 `PREFERRED_CHALLENGE`的 `PASSWORD_SRP`，您也必須包含 `SRP_A`。如果您的使用者、使用者集區和應用程式用戶端都已針對偏好的挑戰設定，Amazon Cognito 會回應該挑戰的下一個步驟，例如`PASSWORD_VERIFIER`在 `PASSWORD_SRP`流程或 `EMAIL_OTP``SMS_OTP`流程中的 [CodeDeliveryDetails](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CodeDeliveryDetailsType.html)。如果無法使用偏好的挑戰，Amazon Cognito 會回應 `SELECT_CHALLENGE`和可用的挑戰清單。

1. 先在 中簽署使用者，然後請求其選擇型身分驗證選項。具有登入使用者的存取權杖的 [GetUserAuthFactors](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUserAuthFactors.html) 請求會傳回其可用的選擇型身分驗證因素及其 MFA 設定。使用此選項，使用者可以先使用使用者名稱和密碼登入，然後啟用其他形式的身分驗證。您也可以使用此操作來檢查已使用偏好挑戰登入之使用者的其他選項。

若要[設定您的應用程式用戶端](authentication.md#authentication-implement)進行以選擇為基礎的身分驗證，請將 `ALLOW_USER_AUTH`新增至允許的身分驗證流程。您還必須選擇想要在使用者集區組態中允許的以選擇為基礎的因素。下列程序說明如何選擇以選擇為基礎的身分驗證因素。

------
#### [ Amazon Cognito console ]

**在使用者集區中設定以選擇為基礎的身分驗證選項**

1. 登入 AWS 並導覽至 [Amazon Cognito 使用者集區主控台](https://console.aws.amazon.com/cognito/v2/idp)。選擇使用者集區或建立新的集區。

1. 在使用者集區組態中，選取**登入**功能表。尋找以**選擇為基礎的登入選項**，然後選擇**編輯**。

1. **密碼**選項一律可用。這包括 `PASSWORD`和 `PASSWORD_SRP`流程。選取您要新增至使用者選項**的其他選項**。您可以新增 的 **Passkey**`WEB_AUTHN`、 **的電子郵件訊息一次性密碼**`EMAIL_OTP`，以及 的**簡訊一次性密碼**`SMS_OTP`。

1. 選擇**儲存變更**。

------
#### [ API/SDK ]

下列部分 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 或 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) 請求內文會設定選擇型身分驗證的所有可用選項。

```
"Policies": {
    "SignInPolicy": {
        "AllowedFirstAuthFactors": [
            "PASSWORD",
            "WEB_AUTHN",
            "EMAIL_OTP",
            "SMS_OTP"
        ]
    }
},
```

------

## 用戶端型身分驗證
<a name="authentication-flows-selection-client"></a>

用戶端型身分驗證支援下列身分驗證流程。在 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthFlow) 或 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-AuthFlow) 的 `AuthFlow` 參數中宣告這些選項。

1. `USER_PASSWORD_AUTH` 和 `ADMIN_USER_PASSWORD_AUTH`

   [使用持久性密碼登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-password)

   [登入後的 MFA](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-mfa)

   此身分驗證流程等同於`PASSWORD`以選擇為基礎的身分驗證。

1. `USER_SRP_AUTH`

   [使用持久性密碼和安全承載登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp)

   [登入後的 MFA](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-mfa)

   此身分驗證流程等同於`PASSWORD_SRP`以選擇為基礎的身分驗證。

1. `REFRESH_TOKEN_AUTH`

   [重新整理權杖](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-refresh)

   此身分驗證流程僅適用於以用戶端為基礎的身分驗證。

1. `CUSTOM_AUTH`

   [自訂身分驗證](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-custom)

   此身分驗證流程僅適用於以用戶端為基礎的身分驗證。

透過以用戶端為基礎的身分驗證，Amazon Cognito 會假設您已決定使用者在開始身分驗證流程之前，要如何進行身分驗證。判斷使用者想要提供的登入因素的邏輯必須使用預設設定或自訂提示來決定，然後在向使用者集區提出的第一個請求中宣告。`InitiateAuth` 請求會宣告直接對應至其中一個所列選項`AuthFlow`的登入，例如 `USER_SRP_AUTH`。透過此宣告，請求也包含開始身分驗證的參數，例如 `USERNAME`、 `SECRET_HASH`和 `SRP_A`。Amazon Cognito 可能會針對 `PASSWORD_VERIFIER` SRP 或 TOTP MFA `SOFTWARE_TOKEN_MFA`的密碼登入等其他挑戰追蹤此請求。

若要[設定應用程式用戶端](authentication.md#authentication-implement)進行用戶端型身分驗證，`ALLOW_USER_AUTH`請將 以外的任何身分驗證流程新增至允許的身分驗證流程。範例為 `ALLOW_USER_PASSWORD_AUTH`、`ALLOW_CUSTOM_AUTH`、`ALLOW_REFRESH_TOKEN_AUTH`。若要允許以用戶端為基礎的身分驗證流程，不需要額外的使用者集區組態。

# 身分驗證流程
<a name="amazon-cognito-user-pools-authentication-flow-methods"></a>

使用 Amazon Cognito 使用者集區的身分驗證程序，最適合描述為使用者進行初始選擇、提交登入資料，以及回應其他挑戰*的流程*。當您在應用程式中實作受管登入身分驗證時，Amazon Cognito 會管理這些提示和挑戰的流程。當您在應用程式後端使用 AWS SDK 實作流程時，您必須建構請求的邏輯、提示使用者輸入，以及回應挑戰。

身為應用程式管理員，您的使用者特性、安全需求和授權模型有助於判斷您希望如何允許使用者登入。問自己下列問題。
+ 我想要允許使用者使用來自[其他身分提供者 (IdPs](#amazon-cognito-user-pools-authentication-flow-methods-federated)登入資料登入嗎？
+ [使用者名稱和密碼](#amazon-cognito-user-pools-authentication-flow-methods-password)是否有足夠的身分驗證？
+ 是否可以攔截我的使用者名稱密碼身分驗證身分驗證請求？ 我想要我的應用程式傳輸密碼，還是[使用雜湊和 salt 交涉身分驗證](#amazon-cognito-user-pools-authentication-flow-methods-srp)？
+ 我想要允許使用者略過密碼項目[，並接收登入的一次性密碼](#amazon-cognito-user-pools-authentication-flow-methods-passwordless)嗎？
+ 我想要允許使用者使用[指紋、臉部或硬體安全金鑰](#amazon-cognito-user-pools-authentication-flow-methods-passkey)登入嗎？
+ 如果有的話，我何時需要[多重要素驗證 (MFA)](#amazon-cognito-user-pools-authentication-flow-methods-mfa)？
+ 是否要[保留使用者工作階段，而不重新提示登入資料](#amazon-cognito-user-pools-authentication-flow-methods-refresh)？
+ 我想要將[授權模型延伸](#amazon-cognito-user-pools-authentication-flow-methods-custom)到 Amazon Cognito 的內建功能之外嗎？

當您有這些問題的答案時，您可以了解如何啟用相關功能，並在應用程式提出的身分驗證請求中實作這些功能。

為使用者設定登入流程後，您可以使用請求 [GetUserAuthFactors](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUserAuthFactors.html) API 操作來檢查 MFA 和[選擇型](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)身分驗證因素的目前狀態。此操作需要使用登入使用者的存取權杖進行授權。它會傳回使用者身分驗證因素和 MFA 設定。

**Topics**
+ [使用第三方 IdPs登入](#amazon-cognito-user-pools-authentication-flow-methods-federated)
+ [使用持久性密碼登入](#amazon-cognito-user-pools-authentication-flow-methods-password)
+ [使用持久性密碼和安全承載登入](#amazon-cognito-user-pools-authentication-flow-methods-srp)
+ [使用一次性密碼的無密碼登入](#amazon-cognito-user-pools-authentication-flow-methods-passwordless)
+ [使用 WebAuthn 通行金鑰進行無密碼登入](#amazon-cognito-user-pools-authentication-flow-methods-passkey)
+ [登入後的 MFA](#amazon-cognito-user-pools-authentication-flow-methods-mfa)
+ [重新整理權杖](#amazon-cognito-user-pools-authentication-flow-methods-refresh)
+ [自訂身分驗證](#amazon-cognito-user-pools-authentication-flow-methods-custom)
+ [使用者遷移身分驗證流程](#amazon-cognito-user-pools-user-migration-authentication-flow)

## 使用第三方 IdPs登入
<a name="amazon-cognito-user-pools-authentication-flow-methods-federated"></a>

Amazon Cognito 使用者集區可做為 IdPs 之間身分驗證工作階段的中繼代理程式，例如 Sign in with Apple、Login with Amazon 和 OpenID Connect (OIDC) 服務。此程序也稱為*聯合登入*或*聯合身分驗證*。聯合身分驗證不會利用您可以在應用程式用戶端中建置的任何身分驗證流程。反之，您可以將設定的使用者集區 IdPs指派給應用程式用戶端。當使用者在受管登入中選取其 IdP，或您的應用程式調用重新導向至其 IdP 登入頁面的工作階段時，就會發生聯合登入。

使用聯合登入，您可以將主要和 MFA 身分驗證因素委派給使用者的 IdP。除非您將其他進階流程連結至本機使用者，否則 Amazon Cognito 不會將本節中的其他進階流程新增至聯合身分使用者。 [將聯合身分使用者連結至現有的使用者描述檔](cognito-user-pools-identity-federation-consolidate-users.md)未連結的聯合身分使用者具有使用者名稱，但它們是映射屬性資料的存放區，通常不會用於登入，與瀏覽器型流程無關。

**實作資源**
+ [使用第三方身分提供者登入使用者集區](cognito-user-pools-identity-federation.md)

## 使用持久性密碼登入
<a name="amazon-cognito-user-pools-authentication-flow-methods-password"></a>

在 Amazon Cognito 使用者集區中，每個使用者都有使用者名稱。這可能是電話號碼、電子郵件地址，或選擇或管理員提供的識別符。此類型的使用者可以使用使用者名稱及其密碼登入，並選擇性地提供 MFA。使用者集區可以使用公有或 IAM 授權的 API 操作和 SDK 方法執行使用者名稱密碼登入。您的應用程式可以直接將密碼傳送到您的使用者集區以進行身分驗證。您的使用者集區會回應額外的挑戰或 JSON Web 字符 (JWTs)，這是身分驗證成功的結果。

------
#### [ Activate password sign-in ]

若要使用使用者名稱和密碼啟用[用戶端型身分驗證](authentication-flows-selection-sdk.md#authentication-flows-selection-client)，請將您的應用程式用戶端設定為允許。在 Amazon Cognito 主控台中，導覽至使用者集區組態中應用程式下的**應用程式****用戶端**選單。若要允許用戶端行動或原生應用程式的純密碼登入，請編輯應用程式用戶端，然後在**身分驗證流程**下選擇**使用使用者名稱和密碼登入：ALOW\$1USER\$1PASSWORD\$1AUTH**。若要允許伺服器端應用程式的純密碼登入，請編輯應用程式用戶端，然後選擇**使用伺服器端管理登入資料登入：ALOW\$1ADMIN\$1USER\$1PASSWORD\$1AUTH**。

若要使用使用者名稱和密碼啟用以[選擇為基礎的身分驗證](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)，請將您的應用程式用戶端設定為允許。編輯您的應用程式用戶端，然後選擇以**選擇為基礎的登入：ALOW\$1USER\$1AUTH**。

![\[Amazon Cognito 主控台的螢幕擷取畫面，說明應用程式用戶端的純密碼身分驗證流程選擇。已選取選項 ALLOW_USER_PASSWORD_AUTH、ALOW_ADMIN_USER_PASSWORD_AUTH 和 ALLOW_USER_AUTH。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/screenshot-choose-password-admin-password-and-user-auth.png)


若要驗證以選擇為基礎的身分驗證流程中是否提供密碼身分驗證，請導覽至**登入功能表**，並檢閱以**選擇為基礎的登入選項**下的 區段。如果在**可用選項**下顯示**密碼**，您可以使用純密碼身分驗證登入。**密碼**選項包含純和 SRP 使用者名稱密碼身分驗證變體。

![\[Amazon Cognito 主控台的螢幕擷取畫面，說明使用者集區在 USER_AUTH 選擇型登入組態中選擇密碼身分驗證。密碼選項會顯示為作用中。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/screenshot-password-flow-in-user-auth.png)


在 [CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) 或 [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) 請求中`ExplicitAuthFlows`，使用您偏好的username-and-password驗證選項來設定 。

```
"ExplicitAuthFlows": [ 
   "ALLOW_USER_PASSWORD_AUTH",
   "ALLOW_ADMIN_USER_PASSWORD_AUTH",
   "ALLOW_USER_AUTH"
]
```

在 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 或 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) 請求中，`Policies`使用您要支援的以選擇為基礎的身分驗證流程來設定 。中的`PASSWORD`值`AllowedFirstAuthFactors`包含純密碼和 SRP 身分驗證流程選項。

```
"Policies": {
   "SignInPolicy": {
      "AllowedFirstAuthFactors": [
         "PASSWORD",
         "EMAIL_OTP",
         "WEB_AUTHN"
      ]
   }
}
```

------
#### [ Choice-based sign-in with a password ]

若要使用使用者名稱密碼身分驗證將使用者登入應用程式，請設定 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 或 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 請求的內文，如下所示。如果目前使用者符合使用者名稱密碼身分驗證的資格，則此登入請求會成功或繼續進行下一個挑戰。否則，它會回應可用主要要素驗證挑戰的清單。這組參數是登入所需的最低要求。還有其他參數可用。

```
{
   "AuthFlow": "USER_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser",
      "PREFERRED_CHALLENGE" : "PASSWORD",
      "PASSWORD" : "[User's password]"
   },
   "ClientId": "1example23456789"
}
```

您也可以省略 `PREFERRED_CHALLENGE`值，並接收包含使用者合格登入因素清單的回應。

```
{
   "AuthFlow": "USER_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser"
   },
   "ClientId": "1example23456789"
}
```

如果您未提交偏好的挑戰，或提交的使用者不符合他們偏好的挑戰資格，Amazon Cognito 會在 中傳回選項清單`AvailableChallenges`。當 `AvailableChallenges`包含 `ChallengeName`的 時`PASSWORD`，您可以使用 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) 或 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 挑戰回應繼續驗證，格式如下。您必須傳遞`Session`參數，將挑戰回應與 API 回應關聯至您的初始登入請求。這組參數是登入所需的最低要求。還有其他參數可用。

```
{
   "ChallengeName": "PASSWORD",
   "ChallengeResponses": { 
      "USERNAME" : "testuser",
      "PASSWORD" : "[User's Password]"
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response"
}
```

Amazon Cognito 會使用字符或其他必要的挑戰，例如多重要素驗證 (MFA) 來回應合格且成功的偏好挑戰請求和`PASSWORD`挑戰回應。

------
#### [ Client-based sign-in with a password ]

若要使用使用者名稱-密碼身分驗證將使用者登入用戶端應用程式，請設定 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 請求的內文，如下所示。這組參數是登入所需的最低要求。還有其他參數可用。

```
{
   "AuthFlow": "USER_PASSWORD_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser",
      "PASSWORD" : "[User's password]"
   },
   "ClientId": "1example23456789"
}
```

若要使用使用者名稱密碼身分驗證將使用者登入伺服器端應用程式，請設定 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 請求的內文，如下所示。您的應用程式必須使用 AWS 登入資料簽署此請求。這組參數是登入所需的最低要求。還有其他參數可用。

```
{
   "AuthFlow": "ADMIN_USER_PASSWORD_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser",
      "PASSWORD" : "[User's password]"
   },
   "ClientId": "1example23456789"
}
```

Amazon Cognito 會使用字符或其他必要的挑戰來回應成功的請求，例如多重要素驗證 (MFA)。

------

## 使用持久性密碼和安全承載登入
<a name="amazon-cognito-user-pools-authentication-flow-methods-srp"></a>

使用者集區中的另一種使用者名稱密碼登入方法形式是使用安全遠端密碼 (SRP) 通訊協定。此選項會傳送使用者集區可驗證的密碼 — 密碼雜湊和 salt — 知識證明。在對 Amazon Cognito 的請求中沒有可讀取的秘密資訊，您的應用程式是唯一可處理使用者輸入密碼的實體。SRP 身分驗證涉及數學計算，最好由您可以在 SDK 中匯入的現有元件完成。SRP 通常在用戶端應用程式中實作，例如行動應用程式。如需通訊協定的詳細資訊，請參閱 [Stanford SRP 首頁](http://srp.stanford.edu/)。[Wikipedia](https://en.wikipedia.org/wiki/Secure_Remote_Password_protocol) 也有資源和範例。[各種公有程式庫](https://en.wikipedia.org/wiki/Secure_Remote_Password_protocol#Implementations)可用於執行身分驗證流程的 SRP 計算。

Amazon Cognito 身分驗證的 initiate-challenge-respond 序列會使用 SRP 驗證使用者及其密碼。您必須將使用者集區和應用程式用戶端設定為支援 SRP 身分驗證，然後在應用程式中實作登入請求和挑戰回應的邏輯。您的 SRP 程式庫可以產生隨機數字和計算值，向您的使用者集區示範您擁有使用者的密碼。您的應用程式會將這些計算值填入 Amazon Cognito 使用者集區 API 操作`AuthParameters`和用於身分驗證的 SDK 方法中的 JSON 格式 和 `ChallengeParameters` 欄位。

------
#### [ Activate SRP sign-in ]

若要使用使用者名稱和 SRP 啟用[用戶端型身分驗證](authentication-flows-selection-sdk.md#authentication-flows-selection-client)，請將您的應用程式用戶端設定為允許。在 Amazon Cognito 主控台中，導覽至使用者集區組態中應用程式下的**應用程式****用戶端**選單。若要允許用戶端行動或原生應用程式的 SRP 登入，請編輯應用程式用戶端，然後在**身分驗證流程**下選擇**使用安全遠端密碼 (SRP) 登入：ALOW\$1USER\$1SRP\$1AUTH**。

若要使用使用者名稱和 SRP 啟用以[選擇為基礎的身分驗證](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)，請編輯您的應用程式用戶端，然後選擇以**選擇為基礎的登入：ALOW\$1USER\$1AUTH**。

![\[Amazon Cognito 主控台的螢幕擷取畫面，說明應用程式用戶端的安全遠端密碼驗證流程選擇。已選取選項 ALLOW_USER_SRP_AUTH 和 ALLOW_USER_AUTH。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/screenshot-choose-SRP-and-user-auth.png)


若要驗證 SRP 身分驗證是否在您的選擇型身分驗證流程中可用，請導覽至**登入功能表**，並檢閱**選擇型登入選項**下的 區段。如果在**可用選項**下顯示**密碼**，您可以使用 SRP 身分驗證登入。**密碼**選項包含純文字和 SRP 使用者名稱密碼身分驗證變體。

![\[Amazon Cognito 主控台的螢幕擷取畫面，說明使用者集區在 USER_AUTH 選擇型登入組態中選擇密碼身分驗證。密碼選項會棄用為作用中。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/screenshot-password-flow-in-user-auth.png)


在 [CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) 或 [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) 請求中`ExplicitAuthFlows`，使用您偏好的username-and-password驗證選項來設定 。

```
"ExplicitAuthFlows": [ 
   "ALLOW_USER_SRP_AUTH",
   "ALLOW_USER_AUTH"
]
```

在 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 或 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) 請求中，`Policies`使用您要支援的以選擇為基礎的身分驗證流程來設定 。中的`PASSWORD`值同時`AllowedFirstAuthFactors`包含純文字密碼和 SRP 身分驗證流程選項。

```
"Policies": {
   "SignInPolicy": {
      "AllowedFirstAuthFactors": [
         "PASSWORD",
         "EMAIL_OTP",
         "WEB_AUTHN"
      ]
   }
}
```

------
#### [ Choice-based sign-in with SRP ]

若要使用 SRP 以使用者名稱密碼身分驗證將使用者登入應用程式，請設定 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 或 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 請求的內文，如下所示。如果目前使用者符合使用者名稱密碼身分驗證的資格，則此登入請求會成功或繼續進行下一個挑戰。否則，它會回應可用主要要素驗證挑戰的清單。這組參數是登入所需的最低要求。還有其他參數可用。

```
{
   "AuthFlow": "USER_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser",
      "PREFERRED_CHALLENGE" : "PASSWORD_SRP",
      "SRP_A" : "[g^a % N]"
   },
   "ClientId": "1example23456789"
}
```

您也可以省略 `PREFERRED_CHALLENGE`值，並接收包含使用者合格登入因素清單的回應。

```
{
   "AuthFlow": "USER_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser"
   },
   "ClientId": "1example23456789"
}
```

如果您未提交偏好的挑戰，或提交的使用者不符合他們偏好的挑戰資格，Amazon Cognito 會在 中傳回選項清單`AvailableChallenges`。當 `AvailableChallenges`包含 `ChallengeName`的 時`PASSWORD_SRP`，您可以使用 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) 或 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 挑戰回應繼續驗證，格式如下。您必須傳遞`Session`參數，將挑戰回應與 API 回應關聯至您的初始登入請求。這組參數是登入所需的最低要求。還有其他參數可用。

```
{
   "ChallengeName": "PASSWORD_SRP",
   "ChallengeResponses": { 
      "USERNAME" : "testuser",
      "SRP_A" : "[g^a % N]"
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response"
}
```

Amazon Cognito 會以挑戰來回應合格的偏好挑戰請求和`PASSWORD_SRP`挑戰回應`PASSWORD_VERIFIER`。您的用戶端必須完成 SRP 計算，並回應 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) 或 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 請求中的挑戰。

```
{
   "ChallengeName": "PASSWORD_VERIFIER",
   "ChallengeResponses": { 
      "PASSWORD_CLAIM_SIGNATURE" : "string",
      "PASSWORD_CLAIM_SECRET_BLOCK" : "string",
      "TIMESTAMP" : "string"
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response]"
}
```

在成功的`PASSWORD_VERIFIER`挑戰回應上，Amazon Cognito 會發出字符或其他必要的挑戰，例如多重要素驗證 (MFA)。

------
#### [ Client-based sign-in with SRP ]

SRP 身分驗證在用戶端身分驗證中比在伺服器端更為常見。不過，您可以使用 SRP 身分驗證搭配 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 和 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)。若要將使用者登入應用程式，請設定 `InitiateAuth`或 `AdminInitiateAuth`請求的內文，如下所示。這組參數是登入所需的最低要求。還有其他參數可用。

用戶端`SRP_A`從產生器模數 N *g* 產生，提高到秘密隨機整數 *a *的力量。

```
{
   "AuthFlow": "USER_SRP_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser",
      "SRP_A" : "[g^a % N]"
   },
   "ClientId": "1example23456789"
}
```

Amazon Cognito 會以 `PASSWORD_VERIFIER` 挑戰回應。您的用戶端必須完成 SRP 計算，並回應 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) 或 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 請求中的挑戰。

```
{
   "ChallengeName": "PASSWORD_VERIFIER",
   "ChallengeResponses": { 
      "PASSWORD_CLAIM_SIGNATURE" : "string",
      "PASSWORD_CLAIM_SECRET_BLOCK" : "string",
      "TIMESTAMP" : "string"
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response]"
}
```

在成功的`PASSWORD_VERIFIER`挑戰回應上，Amazon Cognito 會發出字符或其他必要的挑戰，例如多重要素驗證 (MFA)。

------

## 使用一次性密碼的無密碼登入
<a name="amazon-cognito-user-pools-authentication-flow-methods-passwordless"></a>

密碼可能會遺失或遭竊。您可能只想驗證您的使用者是否可以存取已驗證的電子郵件地址、電話號碼或驗證器應用程式。解決方案是*無密碼*登入。您的應用程式可以提示使用者輸入使用者名稱、電子郵件地址或電話號碼。然後，Amazon Cognito 會產生一次性密碼 (OTP)，這是他們必須確認的代碼。成功的程式碼會完成身分驗證。

一次性密碼 (OTP) 身分驗證流程與使用者集區中所需的多重要素驗證 (MFA) 不相容。當您將 `FactorConfiguration`設定為 時，具有使用者驗證的通行密鑰身分驗證可以滿足 MFA 要求`MULTI_FACTOR_WITH_USER_VERIFICATION`。如果您的使用者集區中是選用的 MFA，則已啟用 MFA 的使用者無法使用 OTP 第一個因素登入。在 MFA 選用使用者集區中沒有 MFA 偏好設定的使用者可以使用無密碼因素登入。如需詳細資訊，請參閱[使用者集區 MFA 的須知事項](user-pool-settings-mfa.md#user-pool-settings-mfa-prerequisites)。

當使用者在無密碼身分驗證中正確輸入在簡訊或電子郵件訊息中收到的代碼時，除了驗證使用者之外，您的使用者集區還會將使用者的未驗證電子郵件地址或電話號碼屬性標記為已驗證。無論您將使用者集區設定為[自動驗證](signing-up-users-in-your-app.md)電子郵件地址或電話號碼`CONFIRMED`，使用者狀態也會從 `UNCONFIRMED` 變更為 。

**使用無密碼登入的新選項**  
當您在使用者集區中啟用無密碼身分驗證時，它會變更某些使用者流程的運作方式。

1. 使用者可以在沒有密碼的情況下註冊，並在登入時選擇無密碼因素。您也可以建立沒有密碼的使用者做為管理員。

1. 您使用 [CSV 檔案匯入](cognito-user-pools-using-import-tool.md)的使用者可以使用無密碼因素立即登入。他們不需要在登入前設定密碼。

1. 沒有密碼的使用者可以在沒有 `PreviousPassword` 參數的情況下提交 [ChangePassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ChangePassword.html) API 請求。

**使用 OTPs 自動登入**  
使用電子郵件或簡訊 OTPs 註冊和確認其使用者帳戶的使用者，可以使用與其確認訊息相符的無密碼因素自動登入。在受管登入 UI 中，確認其帳戶且有資格使用確認碼交付方法進行 OTP 登入的使用者，會在提供確認碼後自動繼續第一次登入。在具有 AWS SDK 的自訂應用程式中，將下列參數傳遞至 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 或 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 操作。
+ [ConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html) API 回應中的 `Session` 參數做為`Session`請求參數。
+ 的 [AuthFlow](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthFlow)`USER_AUTH`。

您可以傳遞 [PREFERRED\$1CHALLENGE](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthParameters) `EMAIL_OTP`或 `SMS_OTP`，但這不是必要的。`Session` 參數提供身分驗證證明，當您傳遞有效的工作階段程式碼`AuthParameters`時，Amazon Cognito 會忽略 。

登入操作會傳回表示身分驗證成功、[AuthenticationResult](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AuthenticationResultType.html) 的回應，如果下列情況為 true，則不會有額外的挑戰。
+ `Session` 代碼有效且未過期。
+ 使用者符合 OTP 身分驗證方法的資格。

------
#### [ Activate passwordless sign-in ]

**主控台**  
若要啟用無密碼登入，請將您的使用者集區設定為允許使用一或多個無密碼類型的主要登入，然後將您的應用程式用戶端設定為允許`USER_AUTH`流程。在 Amazon Cognito 主控台中，導覽至使用者集區組態中**身分驗證**下的**登入**選單。編輯**以選擇為基礎的登入選項**，然後選擇**電子郵件訊息一次性密碼**或**簡訊一次性密碼**。您可以啟用這兩個選項。儲存您的變更。

導覽至**應用程式用戶端**選單，然後選擇應用程式用戶端或建立新的用戶端。選取**編輯**，然後選擇**在登入時選取身分驗證類型：ALOW\$1USER\$1AUTH**。

**API/SDK**  
在使用者集區 API 中，`SignInPolicy`在 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 或 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) 請求中使用適當的無密碼選項進行設定。

```
"SignInPolicy": { 
    "AllowedFirstAuthFactors": [ 
        "EMAIL_OTP",
        "SMS_OTP"
    ]
}
```

`ExplicitAuthFlows` 使用 [CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) 或 [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) 請求中的必要選項來設定您的應用程式用戶端。

```
"ExplicitAuthFlows": [ 
   "ALLOW_USER_AUTH"
]
```

------
#### [ Sign in with passwordless ]

無密碼登入沒有您可以在 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) `AuthFlow` 和 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 中指定的[用戶端型](authentication-flows-selection-sdk.md#authentication-flows-selection-client)登入。OTP 身分驗證僅適用於以 [選擇為基礎的](authentication-flows-selection-sdk.md#authentication-flows-selection-choice) `AuthFlow` `USER_AUTH`，您可以在其中請求偏好的登入選項，或從使用者的 [AvailableChallenges](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-response-AvailableChallenges) 選擇無密碼選項。若要將使用者登入應用程式，請設定 `InitiateAuth`或 `AdminInitiateAuth`請求的內文，如下所示。這組參數是登入所需的最低要求。還有其他參數可用。

在此範例中，我們不知道使用者想要以哪種方式登入。如果我們新增`PREFERRED_CHALLENGE`參數，而且使用者可以使用偏好的挑戰，Amazon Cognito 會回應該挑戰。

```
{
   "AuthFlow": "USER_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser"
   },
   "ClientId": "1example23456789"
}
```

您可以在`AuthParameters`此範例中將 `"PREFERRED_CHALLENGE": "EMAIL_OTP"`或 `"PREFERRED_CHALLENGE": "SMS_OTP"` 新增至 。如果使用者符合該偏好方法的資格，您的使用者集區會立即傳送代碼到使用者的電子郵件地址或電話號碼，並傳回 `"ChallengeName": "EMAIL_OTP"`或 `"ChallengeName": "SMS_OTP"`。

如果您未指定偏好的挑戰，Amazon Cognito 會以 `AvailableChallenges` 參數回應。

```
{
   "AvailableChallenges": [ 
      "EMAIL_OTP", 
      "SMS_OTP",
      "PASSWORD"
    ],
   "Session": "[Session ID]"
}
```

此使用者有資格使用電子郵件訊息 OTP、SMS 訊息 OTP 和 username-password 進行無密碼登入。您的應用程式可以提示使用者進行選擇，或根據內部邏輯進行選擇。接著會繼續進行 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) 或 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 請求，以選取挑戰。假設使用者想要使用電子郵件訊息 OTP 完成無密碼身分驗證。

```
{
   "ChallengeName": "SELECT_CHALLENGE",
   "ChallengeResponses": { 
      "USERNAME" : "testuser",
      "ANSWER" : "EMAIL_OTP" 
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response]"
}
```

Amazon Cognito 會回應`EMAIL_OTP`挑戰，並將代碼傳送到您使用者已驗證的電子郵件地址。然後，您的應用程式必須再次回應此挑戰。

如果您以 `EMAIL_OTP`身分請求，這也會是下一個挑戰回應`PREFERRED_CHALLENGE`。

```
{
   "ChallengeName": "EMAIL_OTP",
   "ChallengeResponses": {
      "USERNAME" : "testuser", 
      "EMAIL_OTP_CODE" : "123456" 
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response]"
}
```

------

## 使用 WebAuthn 通行金鑰進行無密碼登入
<a name="amazon-cognito-user-pools-authentication-flow-methods-passkey"></a>

通行密鑰是安全的，並對使用者施加相對較低的工作量。Passkey 登入使用身分*驗證器*，這是使用者可以進行身分驗證的外部裝置。一般密碼會讓使用者暴露在網路釣魚、密碼猜測和憑證遭竊等漏洞中。使用通行密鑰，您的應用程式可以受益於行動電話和其他連接至或內建於資訊系統的裝置上的進階安全措施。常見的通行金鑰登入工作流程會從呼叫您密碼或*登入*資料管理員的裝置呼叫開始，例如 iOS Keychain 或 Google Chrome 密碼管理員。裝置登入資料管理員會提示他們選取通行金鑰，並使用現有的登入資料或裝置解鎖機制進行授權。現代手機具有臉部掃描器、指紋掃描器、解鎖模式和其他機制，有些可同時滿足*您已知的事項*，以及*具有強式身分驗證*原則的事項。如果使用生物識別特徵進行通行金鑰身分驗證，通行金鑰代表*您的身分*。

您可能想要以指紋、人臉或安全金鑰身分驗證取代密碼。這是 *passkey* 或 *WebAuthn* 身分驗證。應用程式開發人員通常會允許使用者在第一次使用密碼登入後註冊生物識別裝置。透過 Amazon Cognito 使用者集區，您的應用程式可以為使用者設定此登入選項。當您的使用者集區`FactorConfiguration`設定為 時，通行金鑰身分驗證可以滿足多重要素身分驗證 (MFA) 要求`MULTI_FACTOR_WITH_USER_VERIFICATION`。在此組態中，具有使用者驗證的通行金鑰身分驗證會計為多重要素身分驗證。

一次性密碼 (OTP) 身分驗證流程與使用者集區中所需的多重要素驗證 (MFA) 不相容。當您將 `FactorConfiguration`設定為 時，具有使用者驗證的通行密鑰身分驗證可以滿足 MFA 要求`MULTI_FACTOR_WITH_USER_VERIFICATION`。如果您的使用者集區中是選用的 MFA，則已啟用 MFA 的使用者無法使用 OTP 第一個因素登入。在 MFA 選用使用者集區中沒有 MFA 偏好設定的使用者可以使用無密碼因素登入。如需詳細資訊，請參閱[使用者集區 MFA 的須知事項](user-pool-settings-mfa.md#user-pool-settings-mfa-prerequisites)。

### 什麼是通行密鑰？
<a name="amazon-cognito-user-pools-authentication-flow-methods-passkey-what-are"></a>

Passkeys 無需記住複雜的密碼或輸入 OTPs即可簡化使用者體驗。Passkey 是以[全球資訊網協會 ](https://www.w3.org/TR/webauthn-3/)(W3C) 和 FIDO （快速線上身分） Alliance 所草擬的 WebAuthn 和 CTAP2 標準為基礎。瀏覽器和平台實作這些標準，為 Web 或行動應用程式提供 APIs 以啟動通行金鑰註冊或身分驗證程序，也為使用者提供 UI 以選擇通行金鑰*驗證器*並與之互動。

當使用者向網站或應用程式註冊驗證器時，驗證器會建立公有/私有金鑰對。WebAuthn 瀏覽器和平台會將公有金鑰提交至網站或應用程式後端的應用程式。驗證器會保留有關使用者和應用程式的私有金鑰、金鑰 IDs 和中繼資料。當使用者想要在已註冊應用程式中使用其已註冊的身分驗證器進行身分驗證時，應用程式會產生隨機挑戰。此挑戰的回應是該應用程式和使用者的驗證器私有金鑰所產生的挑戰數位簽章，以及相關的中繼資料。瀏覽器或應用程式平台會收到數位簽章，並將其傳遞給應用程式後端。然後，應用程式會使用存放的公有金鑰驗證簽章。

**注意**  
您的應用程式不會收到使用者提供給身分驗證器的任何身分驗證秘密，也不會收到私有金鑰的相關資訊。

以下是目前市場上驗證者的一些範例和功能。驗證者可能符合任何或所有這些類別。
+ 有些驗證者會在授予存取權之前，使用 PIN 碼、臉部或指紋的生物識別輸入或密碼等因素執行*使用者驗證*，確保只有合法使用者才能授權動作。其他驗證器沒有任何使用者驗證功能，有些可在應用程式不需要時略過使用者驗證。
+ 有些驗證器，例如 YubiKey 硬體字符，是可攜式的。它們會透過 USB、藍牙或 NFC 連線與裝置通訊。有些驗證者是本機身分，並繫結至平台，例如 PC 上的 Windows Hello 或 iPhone 上的 Face ID。裝置繫結驗證器可以由使用者攜帶，如果夠小，就像行動裝置一樣。有時，使用者可以透過無線通訊，將硬體驗證器與許多不同的平台連線。例如，桌面瀏覽器中的使用者可以在掃描 QR 碼時，使用其智慧型手機做為通行金鑰驗證器。
+ 有些平台繫結的通行金鑰會同步至雲端，以便從多個位置使用。例如，iPhones上的 Face ID 通行金鑰會將通行金鑰中繼資料與其 iCloud Keychain 中的使用者 Apple 帳戶同步。這些通行金鑰會在 Apple 裝置之間授予無縫身分驗證，而不是要求使用者獨立註冊每個裝置。軟體型驗證器應用程式，例如 1Password、Dashlane 和 Bitwarden 同步通行金鑰，涵蓋使用者已安裝應用程式的所有平台。

在 WebAuthn 術語中，網站和應用程式*依賴各方*。每個通行金鑰都與特定的依賴方 ID 相關聯，這是一個統一的識別符，代表接受通行金鑰身分驗證的網站或應用程式。開發人員必須仔細選取其依賴方 ID，才能擁有正確的身分驗證範圍。典型的依賴方 ID 是 Web 伺服器的根網域名稱。具有此依賴方 ID 規格的通行金鑰可以驗證該網域和子網域。當使用者想要存取的網站 URL 與依賴方 ID 不相符時，瀏覽器和平台會拒絕通行金鑰身分驗證。同樣地，對於行動應用程式，只有在應用程式在依存方 ID 指示的路徑上提供的`.well-known`關聯檔案中存在應用程式路徑時，才能使用通行金鑰。

通行金鑰是*可探索*的。瀏覽器或平台可以自動識別和使用它們，而無需使用者輸入使用者名稱。當使用者造訪支援通行金鑰身分驗證的網站或應用程式時，他們可以從瀏覽器或平台已知的通行金鑰清單中選擇，也可以掃描 QR 碼。

### Amazon Cognito 如何實作通行金鑰身分驗證？
<a name="amazon-cognito-user-pools-authentication-flow-methods-passkey-cognito"></a>

通行金鑰是一種選擇加入功能，除了 **Lite** 之外，所有[功能計劃](cognito-sign-in-feature-plans.md)皆可使用。它僅適用於以[選擇為基礎的身分驗證流程](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)。透過[受管登入](authentication-flows-selection-managedlogin.md)，Amazon Cognito 會處理通行金鑰身分驗證的邏輯。您也可以在 [ SDKs 中使用 AWS Amazon Cognito 使用者集區 API](#amazon-cognito-user-pools-authentication-flow-methods)，在您的應用程式後端執行通行金鑰身分驗證。

Amazon Cognito 會辨識使用兩種非對稱密碼編譯演算法之一建立的密碼金鑰：ES256(-7) 和 RS256(-257)。大多數驗證程式都支援這兩種演算法。根據預設，使用者可以設定任何類型的驗證器，例如硬體字符、手機和軟體驗證器應用程式。Amazon Cognito 目前不支援[認證](https://csrc.nist.gov/glossary/term/attestation)強制執行。

在您的使用者集區中，您可以將使用者驗證設定為偏好或必要。在未提供值的 API 請求中，此設定預設為偏好，在 Amazon Cognito 主控台中預設會選取偏好。當您將使用者驗證設定為偏好時，使用者可以設定沒有使用者驗證功能的驗證器，而且註冊和驗證操作可以在沒有使用者驗證的情況下成功。若要在通行金鑰註冊和身分驗證中強制使用者驗證，請將此設定變更為必要。

您在通行金鑰組態中設定的依賴方 (RP) ID 是重要的決策。當您未另外指定 ，且您的[網域品牌版本](managed-login-branding.md)為受管登入時，您的使用者集區預設為預期[自訂網域名稱](cognito-user-pools-add-custom-domain.md)為 RP ID。如果您沒有自訂網域且未另外指定，您的使用者集區會預設為[字首網域](cognito-user-pools-assign-domain-prefix.md)的 RP ID。您也可以將 RP ID 設定為不在公有字尾清單 (PSL) 中的任何網域名稱。您的 RP ID 項目適用於受管登入和 SDK 身分驗證中的通行金鑰註冊和身分驗證。Passkey 僅在行動應用程式中使用 Amazon Cognito 才能找到以您的 RP ID 做為網域的`.well-known`關聯檔案。最佳實務是在網站或應用程式可公開使用之前，先判斷並設定依賴方 ID 的值。如果您變更 RP ID，您的使用者必須使用新的 RP ID 再次註冊。

每個使用者最多可以註冊 20 個通行金鑰。他們至少登入您的使用者集區一次後，才能註冊通行金鑰。受管登入會從通行金鑰註冊中移除大量工作。當您為使用者集區和應用程式用戶端啟用通行金鑰驗證時，具有受管登入網域的使用者集區會提醒最終使用者在註冊新使用者帳戶後註冊通行金鑰。您也可以隨時叫用使用者的瀏覽器，將使用者導向受管登入頁面以進行通行金鑰註冊。使用者必須提供使用者名稱，Amazon Cognito 才能啟動通行金鑰身分驗證。受管登入會自動處理。登入頁面會提示輸入使用者名稱，驗證使用者至少已註冊一個通行金鑰，然後提示輸入通行金鑰登入。同樣地，以 SDK 為基礎的應用程式必須提示輸入使用者名稱，並在身分驗證請求中提供該使用者名稱。

當您使用通行金鑰設定使用者集區身分驗證，且您擁有自訂網域和字首網域時，RP ID 會預設為自訂網域的完整網域名稱 (FQDN)。若要在 Amazon Cognito 主控台中將字首網域設定為 RP ID，請刪除您的自訂網域，或將字首網域的 FQDN 輸入為**第三方網域**。

------
#### [ Activate passkey sign-in ]

**主控台**  
若要使用通行金鑰啟用登入，請設定您的使用者集區以允許使用一或多個無密碼類型的主要登入，然後設定您的應用程式用戶端以允許`USER_AUTH`流程。在 Amazon Cognito 主控台中，導覽至使用者集區組態中**身分驗證**下的**登入**選單。編輯以**選擇為基礎的登入選項**，並將 **Passkey** 新增至**可用選項**清單。

導覽至**身分驗證方法**選單並編輯**通行碼**。
+ **使用者驗證**是使用者集區是否需要通行金鑰裝置，以執行目前使用者是否獲得通行金鑰授權的其他檢查的設定。若要鼓勵使用者設定具有使用者驗證但不需要的裝置，請選取**偏好**。若要僅支援具有使用者驗證的裝置，請選取**需要**。如需詳細資訊，請參閱 https：//w3.org [的使用者驗證](https://www.w3.org/TR/webauthn-2/#user-verification)。
+ **用於依賴方 ID 的網域**是您的應用程式將傳入使用者通行密鑰註冊請求的識別符。它設定與使用者通行密鑰發行者的信任關係目標。您的依賴方 ID 可以是：使用者集區的網域，如果   
**Cognito 網域**  
使用者集區的 Amazon Cognito [字首網域](cognito-user-pools-assign-domain-prefix.md)。  
**自訂網域**  
使用者集區的[自訂網域](cognito-user-pools-add-custom-domain.md)。  
**第三方網域**  
不使用使用者集區受管登入頁面的應用程式網域。此設定通常與沒有[網域](cognito-user-pools-assign-domain.md)的使用者集區相關聯，並使用 SDK AWS 和後端中的使用者集區 API 執行身分驗證。

導覽至**應用程式用戶端**選單，然後選擇應用程式用戶端或建立新的用戶端。選取**編輯**，然後在**身分驗證流程**下，選擇**在登入時選取身分驗證類型：ALOW\$1USER\$1AUTH**。

**API/SDK**  
在使用者集區 API 中，`SignInPolicy`在 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 或 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) 請求中使用適當的通行金鑰選項進行設定。通行金鑰身分驗證`WEB_AUTHN`的選項必須至少隨附一個其他選項。通行金鑰註冊需要現有的身分驗證工作階段。

```
"SignInPolicy": { 
    "AllowedFirstAuthFactors": [ 
        "PASSWORD",
        "WEB_AUTHN"
    ]
}
```

在 [SetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserPoolMfaConfig.html#CognitoUserPools-SetUserPoolMfaConfig-request-WebAuthnConfiguration) 請求的 `WebAuthnConfiguration` 參數中設定您的使用者驗證偏好設定和 RP ID。通行金鑰身分驗證結果的`RelyingPartyId`預期目標可以是您的使用者集區字首或自訂網域，或是您選擇的網域。

```
"WebAuthnConfiguration": { 
   "RelyingPartyId": "example.auth.us-east-1.amazoncognito.com",
   "UserVerification": "preferred",
   "FactorConfiguration": "SINGLE_FACTOR"
}
```

`ExplicitAuthFlows` 使用 [CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) 或 [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) 請求中的必要選項來設定您的應用程式用戶端。

```
"ExplicitAuthFlows": [ 
   "ALLOW_USER_AUTH"
]
```

------
#### [ Register a passkey (managed login) ]

受管登入會處理使用者註冊通行密鑰。當您的使用者集區中啟用通行金鑰身分驗證時，Amazon Cognito 會在註冊新使用者帳戶時提示使用者設定通行金鑰。

Amazon Cognito 不會在使用者已註冊且未設定通行金鑰，或您將其帳戶建立為管理員時提示他們設定通行金鑰。處於此狀態的使用者必須使用密碼或無密碼 OTP 等另一個因素登入，才能註冊通行金鑰。

**註冊通行密鑰**

1. 將使用者導向您的[登入頁面](authorization-endpoint.md)。

   ```
   https://auth.example.com/oauth2/authorize/?client_id=1example23456789&response_type=code&scope=email+openid+phone&redirect_uri=https%3A%2F%2Fwww.example.com
   ```

1. 處理來自使用者的身分驗證結果。在此範例中，Amazon Cognito `www.example.com`會使用您的應用程式交換字符的授權碼將其重新導向至 。

1. 將使用者導向至 register-passkey 頁面。使用者將擁有維護其登入工作階段的瀏覽器 Cookie。通行金鑰 URL 接受 `client_id`和 `redirect_uri` 參數。Amazon Cognito 僅允許已驗證的使用者存取此頁面。使用密碼、電子郵件 OTP 或簡訊 OTP 登入您的使用者，然後調用符合下列模式的 URL。

   您也可以將其他[授權端點](authorization-endpoint.md)參數新增至此請求，例如 `response_type`和 `scope`。

   ```
   https://auth.example.com/passkeys/add?client_id=1example23456789&redirect_uri=https%3A%2F%2Fwww.example.com
   ```

------
#### [ Register a passkey (SDK) ]

您可以使用 [PublicKeyCreationOptions](https://www.w3.org/TR/webauthn-3/#dictdef-publickeycredentialcreationoptions) 物件中的中繼資料註冊通行金鑰登入資料。您可以使用登入使用者的登入資料產生此物件，並將其呈現在 API 請求中給其通行金鑰發行者。發行者將傳回 [RegistrationResponseJSON](https://www.w3.org/TR/webauthn-3/#dictdef-registrationresponsejson) 物件，以確認通行金鑰註冊。

若要開始通行金鑰註冊程序，請使用現有的登入選項登入使用者。使用目前使用者的存取權[杖](authentication-flows-public-server-side.md#user-pool-apis-auth-unauth-token-auth)授權 [StartWebAuthnRegistration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_StartWebAuthnRegistration.html) API 請求。以下是範例`GetWebAuthnRegistrationOptions`請求的內文。

```
{
   "AccessToken": "eyJra456defEXAMPLE"
}
```

來自使用者集區的回應包含 `PublicKeyCreationOptions` 物件。在 API 請求中將此物件呈現給使用者的發行者。它提供公有金鑰和依賴方 ID 等資訊。發行者將回應 `RegistrationResponseJSON` 物件。

在 [CompleteWebAuthnRegistration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CompleteWebAuthnRegistration.html) API 請求中呈現註冊回應，再次使用使用者的存取權杖進行授權。當您的使用者集區以空白內文回應 HTTP 200 回應時，就會註冊使用者的通行金鑰。

------
#### [ Sign in with a passkey ]

無密碼登入沒有`AuthFlow`您可以在 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 和 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 中指定的 。反之，您必須宣告 `AuthFlow` 的 `USER_AUTH`並請求登入選項，或從使用者集區的回應中選擇無密碼選項。若要將使用者登入應用程式，請設定 `InitiateAuth`或 `AdminInitiateAuth`請求的內文，如下所示。這組參數是登入所需的最低要求。還有其他參數可用。

在此範例中，我們知道使用者想要使用通行金鑰登入，並新增`PREFERRED_CHALLENGE`參數。

```
{
   "AuthFlow": "USER_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser",
      "PREFERRED_CHALLENGE" : "WEB_AUTHN"
   },
   "ClientId": "1example23456789"
}
```

Amazon Cognito 會以 `WEB_AUTHN` 挑戰回應。您的應用程式必須回應此挑戰。使用使用者的通行金鑰提供者啟動登入請求。它會傳回 [AuthenticationResponseJSON](https://www.w3.org/TR/webauthn-3/#dictdef-authenticationresponsejson) 物件。

```
{
   "ChallengeName": "WEB_AUTHN",
   "ChallengeResponses": {
      "USERNAME" : "testuser", 
      "CREDENTIAL" : "{AuthenticationResponseJSON}" 
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response]"
}
```

------

## 登入後的 MFA
<a name="amazon-cognito-user-pools-authentication-flow-methods-mfa"></a>

您可以設定使用使用者名稱密碼流程完成登入的使用者，以提示使用來自電子郵件訊息、簡訊或程式碼產生應用程式的一次性密碼進行其他驗證。MFA 與使用一次性密碼的無密碼登入不同。不過，當您在使用者集區 `MULTI_FACTOR_WITH_USER_VERIFICATION`中`FactorConfiguration`將 設定為 時，具有使用者驗證的通行金鑰可以滿足 MFA 要求`WebAuthnConfiguration`。對於以密碼為基礎的流程，使用者集區中的 MFA 是一種挑戰回應模型，其中使用者首先示範他們知道密碼，然後示範他們有權存取其註冊的第二因素裝置。

**實作資源**
+ [將 MFA 新增到使用者集區](user-pool-settings-mfa.md)

## 重新整理權杖
<a name="amazon-cognito-user-pools-authentication-flow-methods-refresh"></a>

當您想要讓使用者在不重新輸入登入資料的情況下保持登入狀態時，*重新整理字符*是您的應用程式必須保留使用者工作階段的工具。應用程式可以將重新整理權杖呈現到您的使用者集區，並交換為新的 ID 和存取權杖。透過權杖重新整理，您可以確保登入的使用者仍處於作用中狀態、取得更新的屬性資訊，以及更新存取控制權利，而無需使用者介入。

**實作資源**
+ [重新整理權杖](amazon-cognito-user-pools-using-the-refresh-token.md)

## 自訂身分驗證
<a name="amazon-cognito-user-pools-authentication-flow-methods-custom"></a>

您可能想要為未列於此處的使用者設定身分驗證方法。您可以使用 Lambda 觸發器的*自訂身分驗證*來執行此操作。在一系列 Lambda 函數中，Amazon Cognito 發出挑戰、詢問使用者必須回答的問題、檢查答案的準確性，然後判斷是否應該發出另一個挑戰。問題和答案可能包括安全問題、對 CAPTCHA 服務的請求、對外部 MFA 服務 API 的請求，或這些項目的序列。

**實作資源**
+ [自訂身分驗證挑戰 Lambda 觸發程序](user-pool-lambda-challenge.md)

### 自訂身分驗證流程
<a name="amazon-cognito-user-pools-custom-authentication-flow"></a>

Amazon Cognito 使用者集區也能讓您使用自訂身分驗證流程，協助您使用 AWS Lambda 觸發程序來建立以挑戰/回應為基礎的身分驗證模型。

自訂身分驗證流程可建立自訂挑戰和回應週期，以滿足不同需求。流程一開始會呼叫 `InitiateAuth` API 操作，指出所要使用的身分驗證類型，並提供任何初始身分驗證參數。Amazon Cognito 會以下列其中一種資訊類型回應 `InitiateAuth` 呼叫：
+ 對使用者的挑戰，伴隨工作階段和參數。
+ 錯誤 (如果使用者驗證失敗)。
+ ID、存取和重新整理權杖 (如果 `InitiateAuth` 呼叫中提供的參數足以讓使用者登入)。(通常，使用者或應用程式必須先回答挑戰，但您的自訂程式碼必須確定這一點)。

 如果 Amazon Cognito 以挑戰回應 `InitiateAuth` 呼叫，應用程式將會收集更多輸入，並呼叫 `RespondToAuthChallenge` 操作。此呼叫提供挑戰回應，並將其傳回工作階段。Amazon Cognito 回應 `RespondToAuthChallenge` 呼叫的方式類似於回應 `InitiateAuth` 呼叫。如果使用者已登入，Amazon Cognito 會提供權杖，或者如果使用者未登入，Amazon Cognito 會提供另一個挑戰，或者錯誤。如果 Amazon Cognito 傳回另一項挑戰，順序將會重複，而應用程式將會呼叫 `RespondToAuthChallenge`，直到使用者成功登入或傳回錯誤。如需 `InitiateAuth` 和 `RespondToAuthChallenge` API 操作的詳細資訊，請參閱 [API 文件](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html)。

### 自訂身分驗證流程與挑戰
<a name="Custom-authentication-flow-and-challenges"></a>

應用程式可以呼叫 `InitiateAuth`，並將`CUSTOM_AUTH` 做為 `Authflow`，以啟動自訂身分驗證流程。使用自訂身分驗證流程時，三個 Lambda 觸發程序會控制挑戰和回應的驗證。
+ `DefineAuthChallenge` Lambda 觸發程序使用以前的挑戰和回應的工作階段陣列作為輸入。然後，它產生下一個挑戰名稱和布林值，指出使用者是否通過身分驗證 (並可被授予權杖)。這個 Lambda 觸發器是一種狀態機器，可控制使用者通過挑戰的路徑。
+ `CreateAuthChallenge` Lambda 觸發程序會以挑戰名稱作為輸入，並產生挑戰和參數來評估回應。當 `DefineAuthChallenge` 傳回 `CUSTOM_CHALLENGE` 作為下一個挑戰，身分驗證流程將會呼叫 `CreateAuthChallenge`。`CreateAuthChallenge` Lambda 觸發程序會在挑戰中繼資料參數中傳遞下一個挑戰類型。
+ `VerifyAuthChallengeResponse` Lambda 函數會評估回應，並傳回布林值，指出回應是否有效。

自訂驗證流程也可以結合內建挑戰，例如 SRP 密碼驗證和透過 SMS 的 MFA。它可以使用自訂挑戰，如 CAPTCHA 或秘密提示問題。

### 在自訂身分驗證流程中使用 SRP 密碼驗證
<a name="Using-SRP-password-verification-in-custom-authentication-flow"></a>

如果您想要將 SRP 包含在自訂身分驗證流程中，就需要從 SRP 開始。
+ 若要在自訂流程中起始 SRP 密碼驗證，應用程式會呼叫 `InitiateAuth` 並以 `CUSTOM_AUTH` 為 `Authflow`。在 `AuthParameters` 地圖中，來自您的應用程式的請求包含 `SRP_A:` (SRP A 值) 和 `CHALLENGE_NAME: SRP_A`。
+ `CUSTOM_AUTH` 流程會以 `challengeName: SRP_A` 和 `challengeResult: true` 的初始工作階段叫用 `DefineAuthChallenge` Lambda 觸發程序。您的 Lambda 函數以 `challengeName: PASSWORD_VERIFIER`、`issueTokens: false` 和 `failAuthentication: false` 回應。
+  應用程式接下來需要用 `challengeName: PASSWORD_VERIFIER` 呼叫 `RespondToAuthChallenge` 和 `challengeResponses` 映射中 SRP 所需的其他參數。
+ 如果 Amazon Cognito 驗證密碼，`RespondToAuthChallenge` 會以 `challengeName: PASSWORD_VERIFIER` 和 `challengeResult: true` 的第二個工作階段叫用 `DefineAuthChallenge` Lambda 觸發程序。到時 `DefineAuthChallenge` Lambda 觸發程序可以回應 `challengeName: CUSTOM_CHALLENGE` 以開始自訂挑戰。
+ 如果為使用者啟用 MFA，則 Amazon Cognito 驗證密碼後，便會要求使用者設定或使用 MFA 登入。

**注意**  
Amazon Cognito 託管的登入網頁無法啟用 [自訂身分驗證挑戰 Lambda 觸發程序](user-pool-lambda-challenge.md)。

如需 Lambda 觸發器的詳細資訊，包括範本程式碼，請參閱 [使用 Lambda 觸發程序來自訂使用者集區工作流程](cognito-user-pools-working-with-lambda-triggers.md)。

## 使用者遷移身分驗證流程
<a name="amazon-cognito-user-pools-user-migration-authentication-flow"></a>

使用者遷移 Lambda 觸發程序有助於將使用者從舊式使用者管理系統遷移到使用者集區。如果您選擇 `USER_PASSWORD_AUTH` 身分驗證流程，使用者就不必使用者遷移期間重設密碼。此流程會在驗證期間透過加密的 SSL 連線，將您的使用者密碼傳送至服務。

當您已遷移所有使用者時，請將流程切換至更安全的 SRP 流程。SRP 流程不會透過網路傳送任何密碼。

若要進一步了解 Lambda 觸發程序，請參閱[使用 Lambda 觸發程序來自訂使用者集區工作流程](cognito-user-pools-working-with-lambda-triggers.md)。

如需使用 Lambda 觸發程序來遷移使用者的詳細資訊，請參閱[透過使用者遷移 Lambda 觸發程序匯入使用者](cognito-user-pools-import-using-lambda.md)。

# API 和 SDK 身分驗證的授權模型
<a name="authentication-flows-public-server-side"></a>

當您使用使用者集區身分驗證開始開發應用程式時，您必須決定適合您應用程式類型的 API 授權模型。授權模型是一種系統，用於提供授權，以使用 Amazon Cognito 使用者集區 API 和 SDK 整合中的身分驗證元件提出請求。Amazon Cognito 有三種授權模式：IAM 授權、公有和字符授權。

使用 IAM 授權請求時，授權來自請求`Authorization`標頭中一組 AWS IAM 登入資料的簽章。對於伺服器端應用程式，此實務會使用 IAM 授權保護身分驗證操作。對於公有 （未驗證） 身分驗證請求，不需要授權。這適用於分發給使用者的用戶端應用程式。使用字符授權的操作，通常與公有操作結合實作，授權來自工作階段字符或包含在請求`Authorization`標頭中的存取字符。Amazon Cognito 身分驗證通常會要求您依序實作兩個或多個 API 操作，而您使用的 API 操作取決於應用程式的特性。應用程式分發給使用者的公有用戶端會使用公有操作，其中登入請求不需要授權。字符授權的操作會在公有應用程式中繼續使用者工作階段。伺服器端用戶端，其中應用程式邏輯託管在遠端系統上，透過登入請求的 IAM 授權來保護身分驗證操作。後面的 API 操作對及其對應的 SDK 方法會映射到可用的授權模型。

每個公有身分驗證操作都有某種形式的伺服器端對等項目，例如 [UpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html) 和 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html)。雖然用戶端操作是由使用者啟動且需要確認，但伺服器端操作假設變更是由使用者集區管理員所遞交，且變更會立即生效。在此範例中，Amazon Cognito 會傳送包含確認碼的訊息給使用者，而使用者的存取權杖會授權提交程式碼的 [VerifyUserAttribute](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifyUserAttribute.html) 請求。伺服器端應用程式可以立即設定任何屬性的值，但是在用於登入時，變更電子郵件地址和電話號碼的值[會受到特殊考量](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html#CognitoUserPools-AdminUpdateUserAttributes-request-UserAttributes)。

若要比較 API 身分驗證並查看 API 操作及其授權模型的完整清單，請參閱 [了解 API、OIDC 和受管登入頁面身分驗證](#user-pools-API-operations)。

------
#### [ Client-side (public) authentication ]

以下是用戶端應用程式中典型的一系列請求

1. 公有 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 操作會提交主要登入資料，例如使用者名稱和密碼。

1. 權杖授權的 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) 操作會從`InitiateAuth`回應和挑戰的答案提交*工作階段*權杖，例如 MFA。工作階段字符授權表示請求屬於not-yet-complete身分驗證週期的一部分。

1. 權杖授權的 [ConfirmDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmDevice.html) 操作會提交*存取權*杖，並執行將記住的裝置新增至使用者設定檔的寫入操作。存取字符授權表示在使用者完成身分驗證後，適用於使用者自助式操作的請求。

如需詳細資訊，請參閱[用戶端身分驗證選項](#amazon-cognito-user-pools-client-side-authentication-flow)及[了解 API、OIDC 和受管登入頁面身分驗證](#user-pools-API-operations)。

------
#### [ Server-side authentication ]

以下是伺服器端操作的典型請求序列。每個請求都有[AWS 簽章第 4 版](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)授權標頭，該標頭使用發行給應用程式伺服器的 IAM 機器登入資料簽署。

1. [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 操作會提交主要登入資料，例如使用者名稱和密碼。

1. [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 操作會將答案提交至挑戰，例如 MFA。

1. [AdminUpdateDeviceStatus](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateDeviceStatus.html) 操作會將來自`AdminInitiateAuth`[回應](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#API_AdminInitiateAuth_ResponseSyntax)的裝置金鑰設定為記住。

如需詳細資訊，請參閱[伺服器端身分驗證選項](#amazon-cognito-user-pools-server-side-authentication-flow)及[了解 API、OIDC 和受管登入頁面身分驗證](#user-pools-API-operations)。

------

使用者身分驗證會透過回答連續挑戰，直到驗證失敗或者 Amazon Cognito 發出權杖給使用者。您可以使用 Amazon Cognito 在包含不同挑戰的程序中重複這些步驟，以支援任何自訂的身分驗證流程。

**Topics**
+ [伺服器端身分驗證選項](#amazon-cognito-user-pools-server-side-authentication-flow)
+ [用戶端身分驗證選項](#amazon-cognito-user-pools-client-side-authentication-flow)
+ [了解 API、OIDC 和受管登入頁面身分驗證](#user-pools-API-operations)
+ [依授權模型分組的 API 操作清單](#user-pool-apis-auth-unauth)

## 伺服器端身分驗證選項
<a name="amazon-cognito-user-pools-server-side-authentication-flow"></a>

Web 應用程式和其他*伺服器端*應用程式會在用戶端載入遠端顯示應用程式的遠端伺服器上實作身分驗證，例如瀏覽器或 SSH 工作階段。伺服器端應用程式通常具有下列特性。
+ 它們內建於安裝在伺服器上的應用程式，使用 Java、Ruby 或 Node.js 等語言。
+ 它們連接到可能有用戶端秘密的使用者集區[應用程式用戶端](user-pool-settings-client-apps.md)，稱為*機密用戶端*。
+ 他們可以存取 AWS 登入資料。
+ 他們叫用[受管登入](cognito-user-pools-managed-login.md)以進行身分驗證，或在使用者集區 API 中使用 IAM 授權的操作搭配 AWS SDK。
+ 它們為內部客戶提供服務，並可能為公眾客戶提供服務。

使用使用者集區 API 的伺服器端操作可以使用密碼、一次性密碼或通行密鑰作為主要登入因素。如果是伺服器端應用程式，使用者集區身分驗證類似於用戶端應用程式的身分驗證，但以下除外：
+ 伺服器端應用程式會發出 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) API 請求。此操作需要具有包含 `cognito-idp:AdminInitiateAuth`和 許可的 AWS 登入資料`cognito-idp:AdminRespondToAuthChallenge`。操作會傳回所需的挑戰或身分驗證結果。
+ 當應用程式收到挑戰時，它會發出 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) API 請求。`AdminRespondToAuthChallenge` API 操作也需要 AWS 登入資料。

如需使用 AWS 登入資料簽署 Amazon Cognito API 請求的詳細資訊，請參閱《 *AWS 一般參考*》中的 [Signature 第 4 版簽署程序](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)。

在 `AdminInitiateAuth` 回應 `ChallengeParameters` 中，`USER_ID_FOR_SRP` 屬性 (如果存在) 將會包含使用者的實際使用者名稱，而不是別名 (例如電子郵件地址或電話號碼)。在呼叫 `AdminRespondToAuthChallenge` 期間，在 `ChallengeResponses` 中，您必須在 `USERNAME` 參數中傳遞此使用者名稱。

**注意**  
由於後端管理員實作使用管理員身分驗證流程，因此流程不支援記住的裝置。當您開啟裝置追蹤功能時，管理員身分驗證會成功，但是用來重新整理存取權杖的任何呼叫都會失敗。

## 用戶端身分驗證選項
<a name="amazon-cognito-user-pools-client-side-authentication-flow"></a>

行動應用程式和其他*用戶端*應用程式類型安裝在使用者的裝置上，並在本機執行身分驗證和使用者介面的邏輯。它們通常具有下列特性。
+ 它們內建於 React 原生、Flutter 和 Swift 等語言，並部署到使用者裝置。
+ 它們連接到沒有用戶端秘密的使用者集區[應用程式用戶端](user-pool-settings-client-apps.md)，稱為*公有用戶端*。
+ 他們無法存取會授權 IAM 授權 API 請求的 AWS 登入資料。
+ 他們叫用[受管登入](cognito-user-pools-managed-login.md)進行身分驗證，或在使用者集區 API 中使用公有和字符授權的操作搭配 AWS SDK。
+ 它們為公眾客戶提供服務，並允許任何人註冊和登入。

使用使用者集區 API 的用戶端操作可以使用密碼、一次性密碼或通行金鑰作為主要登入因素。以下程序適用於您使用 [AWS Amplify](https://docs.amplify.aws/javascript/start/getting-started/) 或 [AWS SDK](https://aws.amazon.com/developer/tools/) 所建立的使用者用戶端應用程式。

1. 使用者在應用程式中輸入使用者名稱和密碼。

1. 應用程式會以使用者的使用者名稱和安全遠端密碼 (SRP) 詳細資訊呼叫 `InitiateAuth` 操作。

   此 API 操作會傳回驗證參數。
**注意**  
此應用程式使用 AWS SDK 內建的 Amazon Cognito SRP 功能產生 SRP 詳細資訊。

1. 應用程式會呼叫 `RespondToAuthChallenge` 操作。如果呼叫成功，Amazon Cognito 會傳回使用者的權杖，身分驗證流程便已完成。

   如果 Amazon Cognito 需要另一個挑戰，對 `RespondToAuthChallenge` 的呼叫就不會傳回任何權杖。相反地，呼叫會傳回工作階段。

1. 如果 `RespondToAuthChallenge` 傳回工作階段，應用程式會再次呼叫 `RespondToAuthChallenge`，這次會使用工作階段和挑戰回應 (例如，MFA 程式碼)。

## 了解 API、OIDC 和受管登入頁面身分驗證
<a name="user-pools-API-operations"></a>

Amazon Cognito 使用者集區是多種身分驗證技術的組合。他們倚賴外部身分提供者 IdPs)。它們是使用 OpenID Connect (OIDC) SDKs 實作身分驗證之應用程式的 IdPs。它們以類似 OIDC 身分驗證的 JSON Web 權杖 (JWTs) 發行者身分驗證，但在屬於 AWS SDKs 的 API 方法中提供身分驗證。它們也可以是應用程式的安全進入點。

當您想要註冊、登入和管理使用者集區中的使用者，您有兩種選擇。

1. 您的*受管登入頁面*和傳統*託管 UI* 包括[受管登入使用者互動端點](managed-login-endpoints.md)，以及處理 IdP 和依賴方角色的[聯合端點](federation-endpoints.md)。在您為使用者集區[選擇網域](cognito-user-pools-assign-domain.md)時，會共同組成 Amazon Cognito 啟用的公開網頁套件。若要快速開始使用 Amazon Cognito 使用者集區的身分驗證和授權功能，包括註冊、登入、密碼管理和多重要素驗證 (MFA) 的頁面，請使用 受管登入的內建使用者介面。

   其他使用者集區端點有助於通過第三方身分提供者 (IdP) 的身分驗證。執行的服務包括下列項目。

   1. 服務提供者回呼來自 IdP 的已驗證宣告的端點，例如 `saml2/idpresponse` 和 `oauth2/idpresponse`。當 Amazon Cognito 是應用程式和 IdP 之間的中繼服務提供者 (SP) 時，回呼端點代表該服務。

   1. 提供環境相關資訊的端點，例如 `oauth2/userInfo` 和 `/.well-known/jwks.json`。您的應用程式會在驗證字符或使用 OIDC 或 OAuth 2.0 開發人員程式庫擷取使用者設定檔資料時，使用這些端點。

1. [Amazon Cognito 使用者集區 API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html) 是一組工具，可供您的 Web 或行動應用程式在您自己的自訂前端收集登入資訊後驗證使用者。使用者集區 API 驗證會產生下列 JSON Web 權杖。

   1. 使用者具有驗證屬性宣告的身分權杖。

   1. 存取權杖授權使用者向 [AWS 服務端點](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html)建立權杖授權的 API 請求。
**注意**  
預設中，來自使用者集區 API 身分驗證的存取權杖僅包含 `aws.cognito.signin.user.admin` 範圍。如果您想要產生具有其他範圍的存取權杖，例如授權對第三方 API 的請求，請透過使用者集區端點在驗證時要求範圍，或在 [產生權杖前 Lambda 觸發程序](user-pool-lambda-pre-token-generation.md) 中新增自訂範圍。存取權杖自訂會為您的 AWS 帳單增加成本。

   1. 重新整理字符，可授權新 ID 和存取字符的請求，並重新整理使用者身分和存取控制屬性。

您可以將通常透過使用者集區端點登入的聯合身分使用者連結至您使用者集區的本機身分使用者。本機使用者僅存在於您的使用者集區目錄中，不會透過外部 IdP 進行聯合。如果您在 [AdminLinkProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminLinkProviderForUser.html) API 請求中將其聯合身分連結至本機使用者，則他們可以使用使用者集區 API 登入。如需詳細資訊，請參閱[將聯合身分使用者連結至現有的使用者描述檔](cognito-user-pools-identity-federation-consolidate-users.md)。

Amazon Cognito 使用者集區 API 有雙重用途。

1. 它會建立和設定您的 Amazon Cognito 使用者集區資源。例如，您可以建立使用者集區、新增 AWS Lambda 觸發，以及設定託管受管登入頁面的使用者集區網域。

1. 它會為本機和連結的使用者執行註冊、登入和其他使用者操作。

**Amazon Cognito 使用者集區 API 的範例案例**

1. 您的使用者選擇您在應用中建立的「建立帳戶」按鈕。他們輸入電子郵件地址和密碼。

1. 您的應用程式傳送 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) API 請求，並在使用者集區中建立新使用者。

1. 您的應用程式提示使用者輸入電子郵件確認碼。您的使用者輸入他們在電子郵件訊息中收到的代碼。

1. 您的應用程式傳送帶有使用者確認代碼的 [ConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html) API 請求。

1. 您的應用程式會提示您的使用者輸入其使用者名稱和密碼，然後輸入其資訊。

1. 您的應用程式傳送 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API 請求並儲存 ID 權杖、存取權杖和重新整理權杖。您的應用程式會呼叫 OIDC 程式庫以管理使用者權杖並維持該使用者的持久性工作階段。

在 Amazon Cognito 使用者集區 API 中，您無法登入透過 IdP 聯合的使用者。您必須透過使用者集區端點驗證這些使用者。如需包含受管登入之使用者集區端點的詳細資訊，請參閱 [使用者集區端點和受管登入參考](cognito-userpools-server-contract-reference.md)。

您的聯合身分使用者可以從受管登入開始並選取其 IdP，或者您可以略過受管登入，並將使用者直接傳送到您的 IdP 來登入。當您對 [授權端點](authorization-endpoint.md) 的 API 請求包含 IdP 參數時，Amazon Cognito 會以無訊息方式將您的使用者重新導向至 IdP 登入頁面。

**具有受管登入頁面的範例案例**

1. 您的使用者選擇您在應用中建立的「建立帳戶」按鈕。

1. 受管登入會為您的使用者提供您已註冊開發人員登入資料的社交身分提供者清單。您的使用者選擇 Apple。

1. 您的應用程式會以提供者名稱 `SignInWithApple` 向 [授權端點](authorization-endpoint.md) 展開請求。

1. 您使用者的瀏覽器會開啟 Apple 身分驗證頁面。您的使用者登入並選擇授權 Amazon Cognito 讀取其設定檔資訊。

1. Amazon Cognito 確認 Apple 存取權杖並查詢使用者的 Apple 設定檔。

1. 您的使用者會向您的應用程式提供 Amazon Cognito 授權碼。

1. 應用程式中的 OIDC 程式庫會與 交換授權碼，[權杖端點](token-endpoint.md)並存放使用者集區發出的 ID 字符、存取字符和重新整理字符。您的應用程式使用 OIDC 程式庫來管理使用者的字符，並維護該使用者的持久性工作階段。

使用者集區 API 和受管登入頁面支援各種案例，如本指南所述。以下各節將探討使用者集區 API 如何進一步劃分為支援您註冊、登入和資源管理需求的類別。

## 依授權模型分組的 API 操作清單
<a name="user-pool-apis-auth-unauth"></a>

Amazon Cognito 使用者集區 API (同時是資源管理介面和面向使用者的身分驗證和授權介面) 根據其操作結合授權模型。根據 API 操作，您可能必須提供 IAM 憑證、存取權杖、工作階段權杖、用戶端秘密，或是以上的組合來提供授權。對於許多使用者身分驗證和授權操作，您可以選擇經身分驗證和未進行身分驗證的請求版本。對於分發給使用者的應用程式 (例如行動應用程式) 而言，未進行身分驗證的操作是最佳安全實務；您不需要在程式碼中加入任何秘密。

您只能在 [IAM 授權的管理操作](#user-pool-apis-auth-unauth-sigv4-management) 和 [IAM 授權的使用者操作](#user-pool-apis-auth-unauth-sigv4-user) 的 IAM 政策中指派許可。

### IAM 授權的管理操作
<a name="user-pool-apis-auth-unauth-sigv4-management"></a>

IAM 授權的管理操作會修改和檢視您的使用者集區和應用程式用戶端組態，就像您在 中所做的一樣 AWS 管理主控台。

例如，若要修改 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) API 請求中的使用者集區，您必須提供 AWS 登入資料和 IAM 許可以更新資源。

若要在 AWS Command Line Interface (AWS CLI) 或 AWS SDK 中授權這些請求，請使用將 IAM 登入資料新增至請求的環境變數或用戶端組態來設定您的環境。如需詳細資訊，請參閱《》中的[AWS 使用您的 AWS 登入資料存取](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys) *AWS 一般參考*。您也可以將請求直接傳送到 Amazon Cognito 使用者集區 API 的[服務端點](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html)。您必須使用內嵌在請求標頭中的 AWS 登入資料來授權或*簽署*這些請求。如需詳細資訊，請參閱[簽署 AWS API 請求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)。


| IAM 授權的管理操作 | 
| --- |
| [AddCustomAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AddCustomAttributes.html) | 
| [CreateGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateGroup.html) | 
| [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) | 
| [CreateResourceServer](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateResourceServer.html) | 
| [CreateUserImportJob](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserImportJob.html) | 
| [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) | 
| [CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) | 
| [CreateUserPoolDomain](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolDomain.html) | 
| [DeleteGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteGroup.html) | 
| [DeleteIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteIdentityProvider.html) | 
| [DeleteResourceServer](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteResourceServer.html) | 
| [DeleteUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUserPool.html) | 
| [DeleteUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUserPoolClient.html) | 
| [DeleteUserPoolDomain](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUserPoolDomain.html) | 
| [DescribeIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeIdentityProvider.html) | 
| [DescribeResourceServer](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeResourceServer.html) | 
| [DescribeRiskConfiguration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeRiskConfiguration.html) | 
| [DescribeUserImportJob](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserImportJob.html) | 
| [DescribeUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPool.html) | 
| [DescribeUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPoolClient.html) | 
| [DescribeUserPoolDomain](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPoolDomain.html) | 
| [GetCSVHeader](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetCSVHeader.html) | 
| [GetGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetGroup.html) | 
| [GetIdentityProviderByIdentifier](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetIdentityProviderByIdentifier.html) | 
| [GetSigningCertificate](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetSigningCertificate.html) | 
| [GetUICustomization](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUICustomization.html) | 
| [GetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUserPoolMfaConfig.html) | 
| [ListGroups](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListGroups.html) | 
| [ListIdentityProviders](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListIdentityProviders.html) | 
| [ListResourceServers](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListResourceServers.html) | 
| [ListTagsForResource](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListTagsForResource.html) | 
| [ListUserImportJobs](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUserImportJobs.html) | 
| [ListUserPoolClients](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUserPoolClients.html) | 
| [ListUserPools](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUserPools.html) | 
| [ListUsers](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.html) | 
| [ListUsersInGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsersInGroup.html) | 
| [SetRiskConfiguration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetRiskConfiguration.html) | 
| [SetUICustomization](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUICustomization.html) | 
| [SetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserPoolMfaConfig.html) | 
| [StartUserImportJob](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_StartUserImportJob.html) | 
| [StopUserImportJob](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_StopUserImportJob.html) | 
| [TagResource](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_TagResource.html) | 
| [UntagResource](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UntagResource.html) | 
| [UpdateGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateGroup.html) | 
| [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) | 
| [UpdateResourceServer](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateResourceServer.html) | 
| [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) | 
| [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) | 
| [UpdateUserPoolDomain](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolDomain.html) | 

### IAM 授權的使用者操作
<a name="user-pool-apis-auth-unauth-sigv4-user"></a>

IAM 授權的使用者操作註冊、登入、管理登入資料、修改和檢視您的使用者。

例如，您可以擁有一個支援 Web 前端的伺服器端應用程式層。您的伺服器端應用程式是您信任的 OAuth 機密用戶端，可獲得 Amazon Cognito 資源的特殊權限存取權。若要在應用程式中註冊使用者，您的伺服器可以在 [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html) API 請求中包含 AWS 憑證。有關 OAuth 用戶端類型的詳細資訊，請參閱 *OAuth 2.0 授權架構*中的[用戶端類型](https://www.rfc-editor.org/rfc/rfc6749#section-2.1)。

若要在 AWS CLI 或 AWS SDK 中授權這些請求，請使用將 IAM 登入資料新增至請求的環境變數或用戶端組態來設定伺服器端應用程式環境。如需詳細資訊，請參閱《》中的[AWS 使用您的 AWS 登入資料存取](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys) *AWS 一般參考*。您也可以將請求直接傳送到 Amazon Cognito 使用者集區 API 的[服務端點](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html)。您必須使用內嵌在請求標頭中的 AWS 登入資料來授權或*簽署*這些請求。如需詳細資訊，請參閱[簽署 AWS API 請求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)。

如果您的應用程式用戶端具有用戶端秘密，您必須同時提供 IAM 憑證，並根據操作提供 `SecretHash` 參數或 `AuthParameters` 中的 `SECRET_HASH` 值。如需詳細資訊，請參閱[運算私密雜湊值](signing-up-users-in-your-app.md#cognito-user-pools-computing-secret-hash)。


| IAM 授權的使用者操作 | 
| --- |
| [AdminAddUserToGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminAddUserToGroup.html) | 
| [AdminConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminConfirmSignUp.html) | 
| [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html) | 
| [AdminDeleteUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDeleteUser.html) | 
| [AdminDeleteUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDeleteUserAttributes.html) | 
| [AdminDisableProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDisableProviderForUser.html) | 
| [AdminDisableUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDisableUser.html) | 
| [AdminEnableUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminEnableUser.html) | 
| [AdminForgetDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminForgetDevice.html) | 
| [AdminGetDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminGetDevice.html) | 
| [AdminGetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminGetUser.html) | 
| [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) | 
| [AdminLinkProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminLinkProviderForUser.html) | 
| [AdminListDevices](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminListDevices.html) | 
| [AdminListGroupsForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminListGroupsForUser.html) | 
| [AdminListUserAuthEvents](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminListUserAuthEvents.html) | 
| [AdminRemoveUserFromGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRemoveUserFromGroup.html) | 
| [AdminResetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminResetUserPassword.html) | 
| [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) | 
| [AdminSetUserMFAPreference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserMFAPreference.html) | 
| [AdminSetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html) | 
| [AdminSetUserSettings](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserSettings.html) | 
| [AdminUpdateAuthEventFeedback](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateAuthEventFeedback.html) | 
| [AdminUpdateDeviceStatus](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateDeviceStatus.html) | 
| [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) | 
| [AdminUserGlobalSignOut](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUserGlobalSignOut.html) | 

### 未經身分驗證的使用者操作
<a name="user-pool-apis-auth-unauth-unauth"></a>

未經身分驗證的使用者操作為您的使用者註冊、登入及啟動密碼重設。當您希望網際網路上的任何人註冊並登入您的應用程式，請使用未經身分驗證或*公有* API 操作。

例如，要在您的應用程式中註冊使用者，您可以分發 OAuth 公有用戶端，該用戶端不提供對秘密的特殊存取權限。您可以未經身分驗證的 API 操作 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) 註冊此使用者。

若要在您使用 AWS SDK 開發的公有用戶端中傳送這些請求，您不需要設定任何登入資料。您也可以將請求直接傳送到 Amazon Cognito 使用者集區 API 的[服務端點](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html)，不需要額外授權。

如果您的應用程式用戶端具有用戶端秘密，則必須根據操作提供 `SecretHash` 參數或 `AuthParameters` 中的 `SECRET_HASH` 值。如需詳細資訊，請參閱[運算私密雜湊值](signing-up-users-in-your-app.md#cognito-user-pools-computing-secret-hash)。


| 未經身分驗證的使用者操作 | 
| --- |
| [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) | 
| [ConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html) | 
| [ResendConfirmationCode](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ResendConfirmationCode.html) | 
| [ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) | 
| [ConfirmForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html) | 
| [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) | 

### 權杖授權的使用者操作
<a name="user-pool-apis-auth-unauth-token-auth"></a>

權杖授權的使用者操作會在使用者登入或開始登入程序後，登出、管理憑證、修改和檢視您的使用者。如果您不想在應用程式中分發秘密，並且想要以使用者自己的憑證授權請求時，請使用權杖授權 API 操作。如果您的使用者已完成登入，則必須使用存取權杖授權其權杖授權的 API 請求。如果您的使用者正在進行登入程序，您必須使用 Amazon Cognito 在回應先前請求時傳回的工作階段權杖來授權其權杖授權的 API 請求。

例如，在公有用戶端中，您可能會想要將更新使用者設定檔的寫入存取權限，限制為僅針對使用者自己的設定檔。若要進行此更新，您的用戶端可以在 [UpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html) API 請求中包含使用者的存取權杖。

若要在您使用 AWS SDK 開發的公有用戶端中傳送這些請求，您不需要設定任何登入資料。在請求中包含 `AccessToken` 或 `Session` 參數。您也可以將請求直接傳送到 Amazon Cognito 使用者集區 API 的[服務端點](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html)。要授權對服務端點的請求，請在請求的 POST 內文中包含存取或工作階段權杖。

若要簽署權杖授權操作的 API 請求，請在請求中以 `Bearer <Base64-encoded access token>` 格式包括存取權杖作為 `Authorization` 標頭。


| 權杖授權的使用者操作 | AccessToken | Session (工作階段) | 
| --- |--- |--- |
| [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) |  | ✓ | 
| [ChangePassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ChangePassword.html) | ✓ |  | 
| [GetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html) | ✓ |  | 
| [StartWebAuthnRegistration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_StartWebAuthnRegistration.html) | ✓ |  | 
| [CompleteWebAuthnRegistration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CompleteWebAuthnRegistration.html) | ✓ |  | 
| [DeleteWebAuthnCredential](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteWebAuthnCredential.html) | ✓ |  | 
| [ListWebAuthnCredentials](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListWebAuthnCredentials.html) | ✓ |  | 
| [UpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html) | ✓ |  | 
| [DeleteUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUserAttributes.html) | ✓ |  | 
| [DeleteUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUser.html) | ✓ |  | 
| [ConfirmDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmDevice.html) | ✓ |  | 
| [ForgetDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgetDevice.html) | ✓ |  | 
| [GetDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetDevice.html) | ✓ |  | 
| [ListDevices](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListDevices.html) | ✓ |  | 
| [UpdateDeviceStatus](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateDeviceStatus.html) | ✓ |  | 
| [GetUserAttributeVerificationCode](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUserAttributeVerificationCode.html) | ✓ |  | 
| [VerifyUserAttribute](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifyUserAttribute.html) | ✓ |  | 
| [SetUserSettings](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserSettings.html) | ✓ |  | 
| [SetUserMFAPreference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserMFAPreference.html) | ✓ |  | 
| [GlobalSignOut](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GlobalSignOut.html) | ✓ |  | 
| [UpdateAuthEventFeedback](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateAuthEventFeedback.html) |  | ✓ | 
| [AssociateSoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AssociateSoftwareToken.html) | ✓ | ✓ | 
| [VerifySoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifySoftwareToken.html) | ✓ | ✓ | 
| [RevokeToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RevokeToken.html)¹ |  |  | 
| [GetTokensFromRefreshToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetTokensFromRefreshToken.html)¹ |  |  | 

1 `RevokeToken`並將`GetTokensFromRefreshToken`重新整理字符作為授權參數。重新整理權杖用作授權權杖，並作為目標資源。