

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

# 身分驗證流程
<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\_USER\_PASSWORD\_AUTH**。若要允許伺服器端應用程式的純密碼登入，請編輯應用程式用戶端，然後選擇**使用伺服器端管理登入資料登入：ALOW\_ADMIN\_USER\_PASSWORD\_AUTH**。

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

![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\_USER\_SRP\_AUTH**。

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

![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\_CHALLENGE](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\_USER\_AUTH**。

**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\_USER\_AUTH**。

**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)。