从aws cognito

时间:2017-10-31 05:25:02

标签: ios amazon-web-services aws-lambda amazon-cognito

我开始为我的虚拟ios应用程序探索AWS cognito,虽然我在新用户注册时收到了电子邮件中的确认链接,然后单击它会正确验证电子邮件。

我们是否有忘记密码的相同功能,即获取链接而不是代码,并将其重定向到我的虚拟网站,其中只有用户需要输入的是新密码。

提前谢谢。

6 个答案:

答案 0 :(得分:5)

是。您可以拨打ForgotPassword端点:

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

然后,您需要拨打电话(从您的网站代码)到ConfirmForgotPassword端点重置密码:

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

答案 1 :(得分:5)

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

它是通过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 :(得分:2)

我忘记了几个月前我问过的这个问题,想到用答案更新它。因此,根据AWS文档:&#34;调用此API会将消息发送给最终用户,并使用更改用户密码所需的确认码。对于Username参数,您可以使用用户名或用户别名。如果用户存在经过验证的电话号码,则会将确认码发送到电话号码。否则,如果存在经过验证的电子邮件,则会将确认代码发送到电子邮件。如果既不存在经过验证的电话号码也不存在经过验证的电子邮件,则会引发InvalidParameterException。 &#34;
Here is the link to AWS doc.
因此,可能有一些解决方法可以实现它,但AWS Cognito现在不支持为忘记密码发送自我验证链接。

答案 3 :(得分:0)

我知道这个问题已经得到了回答和接受,尽管Cognito确实没有开箱即用地做到这一点,但我想找到一种使它无缝运行的方法。

这是我想出的:

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

对此有何想法?我使用相同的机制来使用户注册无缝地进行工作,尽管这需要更多的工作。

答案 4 :(得分:0)

您必须触发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);
};

答案 5 :(得分:0)

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

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"
            alt="logo"
            src=""
            width="248"
            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;
};

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