忘记了来自 aws cognito 的密码链接

Posted

技术标签:

【中文标题】忘记了来自 aws cognito 的密码链接【英文标题】:Forgot password link from aws cognito 【发布时间】:2018-04-12 04:59:16 【问题描述】:

我开始为我的虚拟 ios 应用程序探索 AWS cognito,尽管我在新用户注册期间收到了电子邮件中的确认链接,单击它可以正确验证电子邮件。 我们是否具有相同的忘记密码功能,即获取链接而不是代码并将其重定向到我的虚拟网站,用户只需输入新密码。 提前致谢。

【问题讨论】:

【参考方案1】:

我有可能在我的项目中实现了这一点。

它通过 aws cognito 中的触发器完成。

在自定义消息触发器中设置要触发的 lambda 函数。

const AWS = require('aws-sdk');

exports.handler = (event, context, callback) => 

    var CustomMessage_ForgotPassword = `<style>
        p 
        display: block;
        margin-block-start: 1em;
        margin-block-end: 1em;
        margin-inline-start: 0px;
        margin-inline-end: 0px;
        
        </style>

        <div id=":x9" class="a3s aXjCH " role="gridcell" tabindex="-1"><p>Hello,</p>
        <p>Follow this link to reset your Password. </p>
        <p><a href="https://your-website.com/reset-password?confirmation_code=$event.request.codeParameter&user_name=$event.userName"> Reset Password </a></p>
        <p>If you didn’t ask to change password, you can ignore this email.</p>
        <p>Thanks,</p>
        <p>Your website team</p>
        </div>`


    if (event.triggerSource === "CustomMessage_ForgotPassword") 
        event.response.emailMessage = CustomMessage_ForgotPassword;
    

    callback(null, event);
;

然后在您的网站上创建一条处理此代码的路由。

【讨论】:

您在您的网站上显示什么样的页面/表单?【参考方案2】:

是的。您可以调用ForgotPassword 端点:


   "AnalyticsMetadata":  
      "AnalyticsEndpointId": "string"
   ,
   "ClientId": "string",
   "SecretHash": "string",
   "Username": "string"
 

然后您需要(从您的网站代码)调用ConfirmForgotPassword 端点来重置密码:


   "AnalyticsMetadata":  
      "AnalyticsEndpointId": "string"
   ,
   "ClientId": "string",
   "ConfirmationCode": "string",
   "Password": "string",
   "SecretHash": "string",
   "Username": "string"

【讨论】:

【参考方案3】:

我忘记了几个月前我问过的这个问题,想用答案更新它。因此,根据 AWS 文档:“调用此 API 会导致向最终用户发送一条消息,其中包含更改用户密码所需的确认码。对于 Username 参数,您可以使用用户名或用户别名。如果用户存在已验证的电话号码,则将确认码发送到该电话号码。否则,如果存在已验证的电子邮件,则将确认码发送到该电子邮件。如果既没有经过验证的电话号码也没有验证码已验证的电子邮件存在,抛出 InvalidParameterException。"Here is the link to AWS doc. 所以可能有一些解决方法来实现它,但是 AWS Cognito 目前不支持发送忘记密码的自我验证链接。

【讨论】:

根据 AWS 支持,截至 2019 年 4 月,这仍然不受支持。【参考方案4】:

我知道这个问题已经得到回答和接受,虽然 Cognito 确实没有开箱即用,但我想找到一种方法让它无缝地工作。

这是我想出的:

    使用电子邮件输入框在您的网站上创建一个页面。用户提交时,使用用户池和邮箱创建CognitoUser实例,并在用户上调用forgotPassword函数。 创建一个电子邮件拦截器 Lambda,如 Mayur Shingare 的回答中所述。 将此 Lambda 连接到自定义消息触发器。用户现在应该会收到一封包含您的自定义电子邮件的邮件,其中在查询参数中包含验证码和他的电子邮件,而不是标准验证码电子邮件。 当用户单击链接时,浏览器窗口应该会打开到您的站点。然后,您从 URL 中提取这些查询参数。此页面上有两个框,用户可以输入并确认他的密码。 提交新密码后,使用用户池、邮箱和验证码(来自查询参数)获取CognitoUser实例并调用confirmPassword函数。 成功后,可以使用新密码以编程方式让用户登录,或者将用户重定向到手动登录。

对此有什么想法吗?我使用了相同的机制来让用户注册以无缝方式工作,尽管这需要更多的工作。

【讨论】:

关于 AD 3。请记住,在查询参数中设置电子邮件是一种不好的做法,不应以这种方式公开电子邮件。【参考方案5】:

您必须触发 Lambda 函数并将其附加到常规设置 -> 触发器 -> 您的用户池 (AWS) 中的自定义消息。

这是一个例子。

exports.handler = (event, context, callback) => 
// https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-message.html
// dev
if(event.userPoolId === "YOUR USER POOL ID") 
    // Identify why was this function invoked
    if(event.triggerSource === "CustomMessage_ForgotPassword")            
            event.response.smsMessage = "Your confirmation code is: " + event.request.codeParameter;
            event.response.emailSubject = "Confirmation Code";
            event.response.emailMessage = "Your confirmation code: " + event.request.codeParameter + "<br/><br/>Please visit this url and provide the requested information: ~your url~";   
                



// Return to Amazon Cognito
callback(null, event);
;

【讨论】:

【参考方案6】:

如果您使用 >=10 的较新 Node.js 版本,以下版本可能会有所帮助

const AWS = require('aws-sdk');
exports.handler = async (event) => 
    
    var CustomMessage_ForgotPassword = `<style>
        p 
        display: block;
        font-size: 14px;
        margin-block-start: 1em;
        margin-block-end: 1em;
        margin-inline-start: 0px;
        margin-inline-end: 0px;
        
        </style>

        <div>
        <p>
        <img align="center"
            
            src=""
            
            style="max-width:400px;padding-bottom:0px;vertical-align:bottom;display:inline!important;border:1px none;border-radius:0%;height:auto;outline:none;text-decoration:none"
            >
        <br/>
        <br/>
        <p style="font-size=28px;font-weight:bold;">You have submitted a password change request</p>
        <p>If this was you click the URL below to change your password</p>
        <p><a href="http://localhost:3000/auth/forgot-password?confirmation_code=$event.request.codeParameter&user_name=$event.userName"> Reset Password </a></p>
        
        </div>`


    if (event.triggerSource === "CustomMessage_ForgotPassword") 
        event.response.emailMessage = CustomMessage_ForgotPassword;
    
    
    return event;
;

关键是你发回了相同的事件对象,而不是构造一些新的响应对象。 仅受投票最多的答案启发。谢谢。

【讨论】:

以上是关于忘记了来自 aws cognito 的密码链接的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Cognito 中为 MFA 配置自定义 SMS 消息

AWS Cognito forgotPassword 返回请求中止

我们将如何发送不同的电子邮件模板以重置密码并确认在 AWS cognito 中注册

来自 Lambda 的 AWS Cognito adminCreateUser,使用 Amplify CLI 创建

如何在 Go 中验证来自 AWS Cognito 的 JWT 令牌?

没有密码的 AWS Cognito 用户池