

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

# 使用 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\_USER\_AUTH | 
| [使用持久性密碼登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-password) | 用戶端 | 使用使用者名稱和密碼登入 | ALLOW\_USER\_PASSWORD\_AUTH | 
| [使用持久性密碼和安全承載登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp) | 伺服器端、用戶端 | 使用安全遠端密碼 (SRP) 登入 | ALLOW\_USER\_SRP\_AUTH | 
| [重新整理權杖](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-refresh) | 伺服器端、用戶端 | 從現有的已驗證工作階段取得新的使用者字符 | ALLOW\_REFRESH\_TOKEN\_AUTH | 
| [伺服器端身分驗證](authentication-flows-public-server-side.md#amazon-cognito-user-pools-server-side-authentication-flow) | 伺服器端 | 使用伺服器端管理登入資料登入 | ALLOW\_ADMIN\_USER\_PASSWORD\_AUTH | 
| [自訂身分驗證](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-custom) | 伺服器端和用戶端自訂建置的應用程式。與受管登入不相容。 | 使用來自 Lambda 觸發程序的自訂身分驗證流程登入 | ALLOW\_CUSTOM\_AUTH | 

------
#### [ 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)來讓使用者遷移成為可能，而無需您的使用者重設密碼。