不使用临时密码 对 Cognito 用户进行认证

0

【以下的问题经过翻译处理】 我使用 AdminCreateUser API 调用在我的 Cognito 用户池中创建了一个新用户,添加的用户状态为 Force change password

然后我将向用户发送一个自定义链接,系统将提示用户一个Angular的前端页面,其中只有 2 个输入: 新密码和确认新密码(没有临时密码输入)。

所以我想将临时密码存储在我的后端(Redis 缓存)中,然后只向用户询问他的新密码。

然后使用临时密码(存储在后端Redis缓存中)和新密码(由用户通过前端应用程序提供)对用户进行身份验证

问题在于,如果我没有在邀请消息中同时包含用户名和临时密码,Cognito 将不会发送电子邮件,而是发送默认的 Cognito 电子邮件。

据我所知,自定义电子邮件需要让 Cognito 发送这 2 个变量(用户名和临时密码),否则它不会发送,而是发送默认的 Cognito 邀请消息。

有没有办法在不包含临时密码的情况下发送自定义电子邮件? 这样最终用户可以只专注于提供新密码

我的第二个问题是:我所有的后端都是使用 lambda 的无服务器的,那么我如何将用户密码作为请求正文或 URL 参数安全地从前端传递到后端?

1 回答
0

【以下的回答经过翻译处理】 我了解到您正在使用 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},临时密码是 {####}。”

**--- 解决办法 --- **

这种情况的解决方法包括以下更改:

  1. 第一阶段:发送欢迎邮件
  • 不再依赖 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

  1. 第二阶段:在 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

[3].响应授权挑战 https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.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

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则