如何将 TOTP 作为 Amazon Cognito 用户池的 Multi-Factor Authentication 启用?

上次更新日期:2020 年 12 月 8 日

我想为我的应用程序的用户启用 Multi-Factor Authentication (MFA)。如何使用 Amazon Cognito 用户池使用基于时间的一次性密码 (TOTP) 令牌来执行此操作?

简短描述

要为应用程序用户启用 TOTP MFA,请为用户池设置 TOTP 软件令牌 MFA

重要提示:在配置 TOTP 令牌之前,请记住以下几点:

  • 在配置 TOTP 令牌之前,必须 将 MFA 添加到用户池中。
  • TOTP 令牌不能与用户关联,直到他们尝试登录您的应用程序为止,或者除非他们已经通过身份验证。
  • 目前无法在用户池中为联合身份用户配置 MFA。

以下是如何使用 AWS 命令行界面 (AWS CLI) 和 Google 身份验证器设置 TOTP MFA 的示例。

解决方法

注意:如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本

1.    从 AWS CLI 中运行以下 AssociateSoftwareToken 命令以开始 MFA 令牌生成器设置:

aws cognito-idp associate-software-token --access-token eyJraWQiO........ua5Pq3NaA
{
    "SecretCode":
    "AETQ6XXMDFYMEPFQQ7FD4HKXXXXAOY3MBXIVRBLRXX3SXLSHHWOA"
}

2.    打开 Google 身份验证器主页,然后选择 Get started(开始使用)。

3.    选择 Enter a setup key(输入设置密钥)。

4.    对于 Account name(账户名称),请输入账户名称。例如,BobPhone。

注意:账户名称可以是任何字符串标识符。

5.    对于您的密钥文本输入,请复制并粘贴您在步骤一中运行的 AssociateSoftwareToken 命令所生成的密钥代码。

6.    选择 Type of key(密钥类型)下拉列表,然后选择 Time based(基于时间)。

7.    使用屏幕上显示的基于时间的密码和以下代码验证软件令牌:

aws cognito-idp verify-software-token --access-token eyJraWQiO........ua5Pq3NaA --user-code 269194 --friendly-device-name BobPhone
{
    "Status": "SUCCESS"
}

8.    使用 AWS CLI 中的以下命令之一将用户的 MFA 配置配置为 TOTP MFA:

set-user-mfa-preference

此命令允许用户设置自己的 MFA 配置。

示例 set-user-mfa-preference command

aws cognito-idp set-user-mfa-preference --software-token-mfa-settings Enabled=true,PreferredMfa=true --access-token eyJraWQiO........ua5Pq3NaA

admin-set-user-mfa-preference

此命令允许管理员设置用户的 MFA 配置。

示例 admin-set-user-mfa-preference command

aws cognito-idp admin-set-user-mfa-preference --software-token-mfa-settings Enabled=true,PreferredMfa=true --username Bob --user-pool-id us-east-1_123456789

9.    通过以下方式之一对用户进行身份验证,以测试您的设置:

Amazon Cognito 托管 UI

AWS CLI 中的 InitiateAuthAdminInitiateAuth API 调用。

注意:要使用任一方法对用户进行身份验证,您需要使用该用户的密码、用户名和软件 MFA 代码。

以下示例说明了如何使用 AdminInitiateAuth 命令来测试用户身份验证。

示例 admin-initiate-auth command

aws cognito-idp admin-initiate-auth --user-pool-id us-east-1_123456789 --client-id 3n4b5urk1ft4fl3mg5e62d9ado --auth-flow ADMIN_USER_PASSWORD_AUTH --auth-parameters USERNAME=Bob,PASSWORD=P@ssw0rd

重要提示:确保将以下变量替换为您自己的信息:user-pool-idclient-idusernamepassword。此外,确保通过执行以下各项为用户池应用程序客户端启用 ALLOW_ADMIN_USER_PASSWORD_AUTH 流:

  1. 打开 Amazon Cognito 控制台
  2. 选择 Manage User Pools(管理用户池)。
  3. 选择应用程序客户端,然后选择 Show details(显示详细信息)。
  4. 选择 Enable username password auth for admin APIs for authentication (ALLOW_ADMIN_USER_PASSWORD_AUTH)(为管理员 API 启用用户名密码身份验证以进行身份验证(ALLOW_ADMIN_USER_PASSWORD_AUTH))。
  5. 选择 Save app client changes(保存应用程序客户端更改)。

有关详细信息,请参阅管理员身份验证流程

admin-initiate-auth 命令的示例输出

{
    "ChallengeName": "SOFTWARE_TOKEN_MFA", 
    "ChallengeParameters": {
        "FRIENDLY_DEVICE_NAME":
    "BobPhone", 
        "USER_ID_FOR_SRP": "Bob"
    }, 
    "Session": "Xxz6iadwuWJGN4Z7f4ul5p50IHUqITquoaNxxyDvep.......3A6GokZWKeQ6gkFW4Pgv"
}

示例 admin-respond-to-auth-challenge 命令

aws cognito-idp admin-respond-to-auth-challenge --user-pool-id us-east-1_123456789 --client-id 3n4b5urk1ft4fl3mg5e62d9ado --challenge-name SOFTWARE_TOKEN_MFA --challenge-responses USERNAME=Bob,SOFTWARE_TOKEN_MFA_CODE=123456 --session  Xxz6iadwuWJGN4Z7f4ul5p50IHUqITquoaNxxyDvep.......3A6GokZWKeQ6gkFW4Pgv

重要提示:确保将以下变量替换为您自己的信息:client-idusernamesoftware_token_MFA_Code

admin-respond-to-auth-challenge 命令的示例输出

{
    "AuthenticationResult": {
        "ExpiresIn": 3600, 
        "RefreshToken": "eyJjdHkiOiJKV1QiLCJlbmMi.......dlbjrtyizlLzZZ5fjjCgL__AVHEzYycjJs_h3i-ly_KixDNtz9VEC",
    
        "TokenType": "Bearer", 
        "NewDeviceMetadata": {
    
            "DeviceKey": "us-east-1_28abrd7-10f7-9fc6-a931-3ede1c8ckd75", 
            "DeviceGroupKey": "-Gqkj3brS"
       
    }, 
        "IdToken": "eyJraWQiOiIzcFFSV29Pb........mNMbE_vvPkQYBuA9ackoER1aSABFGaKK4BpgPjMn7la_A", 
        "AccessToken": "eyJraWQiOi...........qwvQq4awt63TyWw"
   
    }, 
    "ChallengeParameters": {}
}

这篇文章对您有帮助吗?


您是否需要账单或技术支持?