Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何在 Amazon Cognito 中自动确认用户?
我想确认用户,然后自动验证他们的电子邮件地址和电话号码,而不使用一次性密码 (OTP)。
简短描述
当用户注册 Amazon Cognito 用户群体时,他们通常必须验证其电子邮件地址或电话号码。这通常是通过将 OTP 发送到用户的电子邮件地址或电话号码进行验证来完成的。也可以在不通过 OTP 验证的情况下自动确认用户。
以下是不使用 OTP 以及用户的电子邮件地址或电话号码即可自动确认用户的高级步骤:
- 创建 AWS Lambda 函数。
- 使用注册前 Lambda 触发器创建 Amazon Cognito 用户群体。
- 在 Amazon Cognito 中注册用户。使用 AWS 管理控制台或 AWS API 验证用户属性。
解决方法
按照以下步骤自动确认用户及其属性,无需 OTP 验证。
创建 Lambda 函数
1. 使用 Amazon Cognito 事件创建 Lambda 函数来处理创建 Amazon Cognito 用户的事件。以下 Python 代码确认用户及其属性,例如电子邮件地址和电话号码。
Python 用户确认代码示例:
import json def lambda_handler(event, context): # Confirm the user event['response']['autoConfirmUser'] = True # Set the email as verified if it is in the request if 'email' in event['request']['userAttributes']: event['response']['autoVerifyEmail'] = True # Set the phone number as verified if it is in the request if 'phone_number' in event['request']['userAttributes']: event['response']['autoVerifyPhone'] = True # Return to Amazon Cognito return event
2. 在 Lambda 函数中设置测试事件,其中包含与注册前 Lambda 触发器相关的数据。以下示例包括步骤 1 中示例 Python 代码的测试事件。
JSON 测试事件示例:
{ "request": { "userAttributes": { "email": "email@example.com", "phone_number": "5550100" } }, "response": {} }
创建 Amazon Cognito 用户群体
1. 创建新的 Amazon Cognito 用户群体或选择现有用户群体。
2. 在选定的用户群体中,通过选择您创建的 Lambda 函数来添加注册前 Lambda 触发器。
注册前 Lambda 触发器可用于添加自定义逻辑和验证新用户。当新用户注册您的应用程序时,Amazon Cognito 会将该事件信息传递给 Lambda 函数。(示例 Lambda 函数位于“创建 Lambda 函数”部分的步骤 1 中。) Lambda 函数会将相同的事件对象返回给 Amazon Cognito,同时在响应中包括任何更改。以下是“创建 Lambda 函数”部分的步骤 2 中测试事件的输出响应。
JSON 测试事件响应示例:
{ "request": { "userAttributes": { "email": "email@example.com", "phone_number": "5550100" } }, "response": { "autoConfirmUser": true, "autoVerifyEmail": true, "autoVerifyPhone": true } }
**注意:**如果新用户使用预先存在的电话号码或电子邮件地址别名注册,则别名将迁移至新用户。然后,先前用户的电话号码或电子邮件地址被标记为未验证。为防止这些更改,请调用 ListUsers API 列出用户群体中所有用户的属性。查看现有用户属性并将其与新的用户属性进行比较,以确保不会发生意外更改。
5. 验证您的用户群体中是否配置了注册前 Lambda 触发器。
注册 Amazon Cognito 用户
使用 Amazon Cognito 托管的 UI 或调用 SignUp API 来注册为新用户。
使用 Amazon Cognito 托管 UI
1. 在 Amazon Cognito 托管 UI 中,注册为新用户。确保提供所有必需的属性。然后,在您注册后,您无需任何验证即可进入回调 URL。
2. 验证您的用户属性。
- 账户状态:Enabled/CONFIRMED(已启用/已确认)
- email_verified:true
- phone_number_verified:true
使用 AWS CLI
1. 在 AWS 命令行界面 (AWS CLI) 中,通过调用 SignUp API 创建用户。
**重要提示:在示例 AWS CLI 命令中,请将示例字符串的所有实例替换为您的值。(例如,将“example_client_id”**替换为您的客户端 ID。)
sign-up 命令示例:
$ aws cognito-idp sign-up --client-id example_client_id --secret-hash example_secret_hash --username example_user_name --password example_password --user-attributes Name="email",Value="email@example.com" Name="phone_number",Value="5550100"
2. 使用应用程序客户端 ID、客户端密钥和 Amazon Cognito 用户群体中用户的用户名计算密钥哈希。
3. 安装 Python。
4. 将以下示例 Python 脚本另存为 .py 文件。
重要提示:在运行示例脚本之前替换以下值。对于 username,输入用户群体中用户的用户名。对于 AppClientId,输入用户群体的应用程序客户端 ID。然后,对于 AppClientSecret,输入您的应用程序客户端密钥。要获得帮助,请运行以下命令:$ python3 secret_hash.py –help。
Python 脚本示例:
import base64, hashlib, hmac, argparse parser = argparse.ArgumentParser() parser.add_argument("--username", required=True) parser.add_argument("--appclientid", required=True) parser.add_argument("--appclientsecret", required=True) args = parser.parse_args() message = bytes(args.username + args.appclientid, 'utf-8') key = bytes(args.appclientsecret, 'utf-8') secret_hash = base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode() print('SecretHash: {}'.format(secret_hash))
5. 使用以下命令从 Python 脚本获取计算的密钥哈希。
命令示例:
$ python3 secret_hash.py --username example_user_name --appclientid example_app_client_id --appclientsecret example_app_client_secret
自动确认的用户示例
1. 通过运行使用用户名、应用程序客户端 ID 和客户端密钥的 Python 脚本来生成密钥哈希。
$ python3 secret_hash.py --username example_user_name --appclientid 11122223333 --appclientsecret je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
输出:
SecretHash: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
2. 通过调用 SignUp API 创建 Amazon Cognito 用户。
$ aws cognito-idp sign-up --client-id 7morqrabcdEXAMPLE_ID --secret-hash wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY = --username example_user_name --password Password1@ --user-attributes Name='email',Value='email@example.com' Name='phone_number',Value='5550100'
输出:
{ "UserConfirmed": true, "UserSub": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111" }
3. 要验证用户属性的状态,请调用 AdminGetUser API。
$ aws cognito-idp admin-get-user --user-pool-id us-east-1_I 111122223333 --username example_user_name
输出:
{ "Username": "example_user_name", "UserAttributes": [ { "Name": "sub", "Value": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111" }, { "Name": "email_verified", "Value": "true" }, { "Name": "phone_number_verified", "Value": "true" }, { "Name": "phone_number", "Value": "5550100" }, { "Name": "email", "Value": "email@example.com" } ], "UserCreateDate": "2022-12-12T11:54:12.988000+00:00", "UserLastModifiedDate": "2022-12-12T11:54:12.988000+00:00", "Enabled": true, "UserStatus": "CONFIRMED" }
最终输出显示电子邮件地址和电话号码属性已通过验证。UserStatus 将设置为 Confirmed(已确认),无需任何外部验证。
- 语言
- 中文 (简体)

相关内容
AWS 官方已更新 5 个月前