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

0

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

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

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

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

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

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

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

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

1 Antwort
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
EXPERTE
beantwortet vor 5 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen