我想使用 Amazon Cognito API 构建身份验证工作流,以将客户端元数据传递给 AWS Lambda 触发器。
解决方案
当您使用 ClientMetadata 参数调用 InitiateAuth API 以在 Amazon Cognito 中启动用户身份验证时,ClientMetadata 仅传递给以下 Lambda 触发器:
相比之下,您必须调用 RespondToAuthChallenge API 才能在这些 Lambda 触发器中包含 ClientMetadata:
在 RespondToAuthChallenge API 调用中包括 ClientMetadata 参数,以应对以下任何身份验证质询:
- 基于时间的一次性密码 (TOTP) 多重身份验证 (MFA)
- 适用于 MFA 的短消息服务 (SMS)
- 设备安全远程密码 (SRP)
- 自定义身份验证质询
此外,ClientMetadata 参数增强了 Lambda 函数用户群体触发器的自定义工作流。
使用 ClientMetadata 参数的 RespondToAuthChallenge API 调用示例
在此示例中,Amazon Cognito 用户群体配置了应用客户端。后身份验证 Lambda 触发器与用户群体相关联。
名为 lambda_handler 的 Lambda 函数会打印它收到的事件:
import json
def lambda_handler(event, context):
# TODO implement
print(event)
return event
**重要事项:**在生产系统中应谨慎使用日志记录,以免泄露 Amazon CloudWatch 中的任何安全数据或机密。
在用户群体中创建测试用户。然后,配置适用于 MFA 的 SMS。
示例 InitiateAuth API 调用请求会启动用户登录:
aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --auth-parameters USERNAME=test,PASSWORD=Password@123 --client-id 1abcd2efgh34ij5klmnopq456r
示例 InitiateAuth API 调用响应:
{
"ChallengeName": "SMS_MFA",
"Session": "1AbcDEfgXXXXX",
"ChallengeParameters": {
"CODE_DELIVERY_DELIVERY_MEDIUM": "SMS",
"CODE_DELIVERY_DESTINATION": "+********1234",
"USER_ID_FOR_SRP": "test"
}
}
示例 RespondToAuthChallenge API 调用请求提交 MFA 代码,而 ClientMetadata 参数包含要传递的任何其他信息:
aws cognito-idp respond-to-auth-challenge --client-id 9zyxw8vuts76rq5ponmlkj432i --challenge-name SMS_MFA --session "9ZyxWVutXXXXX" --challenge-responses USERNAME=test,SMS_MFA_CODE=654321 --client-metadata KeyName1='string',KeyName2='string'
示例 RespondToAuthChallenge API 调用响应:
{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "abXXXX",
"ExpiresIn": 3600,
"TokenType": "Bearer",
"RefreshToken": "abXX",
"IdToken": "abXXX"
}
}
在用户成功进行身份验证并从 Amazon Cognito 接收令牌后,将调用后身份验证 Lambda 触发器。
在 CloudWatch 控制台的日志事件下查找后身份验证 Lambda 触发器结果。在事件正文中查找 ClientMetadata 参数详细信息。
相关信息
自定义身份验证质询 Lambda 触发器
使用 Lambda 触发器自定义用户群体工作流