- 最新
- 投票最多
- 评论最多
【以下的回答经过翻译处理】 我了解到您正在使用 Amazon Cognito 针对您的 Angular 应用程序存储和验证用户,并且在发送不应包含临时密码的自定义欢迎电子邮件时遇到障碍。
说明所需的流程;
(A) 调用 AdminCreateUser API 创建新用户,临时密码存储在后端 Redis 缓存中。
(B) Cognito 向新用户发送一封电子邮件,其中包含用户名和指向“只”接收新密码的 Angular前端的链接。
(C) 提交时,请求被发送到您的 Lambda 后端,从 Redis 缓存中获取临时密码并从用户那里获取新密码。
(D) 后端 Lambda 通过一系列 API 调用设置用户密码 - InitiateAuth[1]/AdminInitiateAuth[2] & RespondToAuthChallenge[3]/AdminRespondToAuthChallenge[4]。
正如您所提到的,当 Cognito 向新创建的用户 (AdminCreateUser) 发送邀请消息时,用户名和临时密码都需要出现在验证消息的正文中(无论您是否在Cognito 控制台,或调整自定义消息 Lambda 触发器 [5])。如果消息模板中不存在所需参数,Cognito 将默认为“您的用户名是 {username},临时密码是 {####}。”
**--- 解决办法 --- **
这种情况的解决方法包括以下更改:
- 第一阶段:发送欢迎邮件
- 不再依赖 Cognito 在创建用户 (AdminCreateUser) 时发送欢迎电子邮件,而是通过在 AdminCreateUser API 调用中将“MessageAction”设置为“SUPPRESS”[6] 来抑制发送欢迎电子邮件的操作。此外,同样的操作也可以通过控制台完成。要添加用户,请转到常规设置 –> 用户和组 –> 创建用户。在创建用户对话框中,取消选中“向这个新用户发送邀请?”在控制台中。
- 要自动向创建的用户发送电子邮件,请使用预注册 Lambda 触发器[7] 手动发送欢迎电子邮件。当通过 AdminCreateUser API 创建用户时,将使用 triggerSource 'PreSignUp_AdminCreateUser' 调用预注册 Lambda 触发器。发送欢迎电子邮件的任务需要在预注册 Lambda 触发器的代码中进行管理。需要进入 Pre sign-up Lambda 函数的核心伪代码是:
if event['triggerSource'] == "PreSignUp_AdminCreateUser":
USERNAME = event['userName']
EMAIL = event['request']['userAttributes']['email']
LOGIN_PORTAL = 'YOUR_ANGULAR_FRONT_END_PAGE_LINK'
MESSAGE = "Welcome to `Application__XXXX`. Your user-name is `{USERNAME}`. Set your password here : {LOGIN_PORTAL}"
# Use your custom email sender, or Amazon SES [8], to send the above 'MESSAGE' to the user's 'EMAIL'
return event
- 第二阶段:在 Lambda 后端重置密码
- 您可以创建与 Lambda 函数集成的 Amazon API Gateway REST API,并将 REST API 的 URL 嵌入 Angular 前端 JS 代码中。这里的想法是,您的 Angular 前端从新创建的用户那里收集新密码字符串,将 “用户名”和“新密码”的值作为POST的请求体发送到 REST API。 REST API 会将相同的内容转发/代理到您的后端 Lambda 函数。
- 当后端 Lambda 函数被 REST API 调用时,它应该;
- 使用event payload 中存在的“用户名”值和 Redis 缓存中的临时密码执行 InitiateAuth[1]/AdminInitiateAuth[2] API, 该调用返回 “NEW_PASSWORD_REQUIRED” 的响应。
- 从上述 API 调用的响应中,使用 RespondToAuthChallenge[3]/AdminRespondToAuthChallenge[4] API 调用响应“NEW_PASSWORD_REQUIRED”质询,其中新密码存在于 Lambda 函数的事件负载中。
请参阅本文[9] 了解 Lambda - API Gateway REST API 集成。 API 网关端点使用 SSL/TLS 证书进行保护,因此传输的密码将在传输过程中加密。
==============
参考:
[1].启动认证 https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html
[2]. AdminInitiateAuth https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html
[4]. AdminRespondToAuthChallenge https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html
[5].自定义消息 Lambda 触发器 - 管理员创建用户示例的自定义消息 https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-message.html#aws-lambda-triggers-custom-message-admin-example
[6]. AdminCreateUser - MessageAction https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html#CognitoUserPools-AdminCreateUser-request-MessageAction
[7].预注册 Lambda 触发器 https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-sign-up.html
[8].使用 AWS 开发工具包通过 Amazon SES 发送电子邮件 - 代码示例 https://docs.aws.amazon.com/ses/latest/dg/send-an-email-using-sdk-programmatically.html#send-an-email-using-sdk-programmatically-examples
[9] 教程:使用 Lambda 代理集成构建 Hello World REST API https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 6 个月前