AWS Cognito用户名/电子邮件登录区分大小写

时间:2018-01-19 13:40:59

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

设置

我正在使用AWS Cognito来管理我的Web应用程序的用户注册和用户访问。具体来说,我使用的是Cognito托管的UI。这意味着Cognito为我的用户提供了一个用户注册用户界面,我没有权限修改我的应用程序的用户注册或登录页面(除了Cognito提供的控件)。我使用电子邮件地址作为用户名,因此只需要新用户提供电子邮件地址和密码。

enter image description here

问题

Cognito将电子邮件地址视为区分大小写。如果用户使用电子邮件地址JOHN_smith@randommail.com注册,则他们无法使用john_smith@randommail.com登录。

我希望注册和登录的用户电子邮件地址不区分大小写。

我尝试了什么

通常,在将电子邮件地址发送到服务器之前,通过在客户端中将电子邮件地址设置为小写来处理这一点很简单。但是我无权访问由Cognito托管的客户端UI。

因此,我的计划是尝试使用Cognito pre-signup trigger调用的Lambda函数来小写用户提供的电子邮件。

  

预注册

     

Amazon Cognito会在用户尝试时调用此触发器   注册(注册),允许您执行自定义验证   接受或拒绝注册请求。

这是我写的lamdba函数:

'use strict';

console.log('Loading function');

exports.handler = (event, context, callback) => {
    console.log('Received event:', JSON.stringify(event, null, 2));

    var triggerSource = event.triggerSource;
    console.log('Received triggerSource:', triggerSource);

    var email = event.request.userAttributes.email;
    console.log('Received email:', email);

    var modifiedEvent = event;

    if (email !== null) {
        var lowerEmail = email.toLowerCase();
        modifiedEvent.request.userAttributes.email = lowerEmail;
        console.log('Set email in request to', lowerEmail);
        console.log('Modified event:', JSON.stringify(modifiedEvent, null, 2));
    } else {
        console.log('Email evaluated as NULL, exiting with no action');
    }

    // Return result to Cognito
    callback(null, modifiedEvent);
};

这个'工作'从某种意义上说,事件请求中的电子邮件地址被修改为小写(john_smith@randommail.com)。但是,在我的Lambda函数收到此事件时,似乎已在用户池中创建了帐户。更改请求中的电子邮件地址无效 - 原始电子邮件地址(JOHN_smith@randommail.com)仍显示在我的用户池中。我怀疑事件中唯一有效的字段是响应字段。以下是我修改后的事件:

{
    "version": "1",
    "region": "us-east-1",
    "userPoolId": "us-east-1_xxxxxxx",
    "userName": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
    "callerContext": {
        "awsSdkVersion": "aws-sdk-java-console",
        "clientId": "xxxxxxxxxxxxxxxxxxxxxx"
    },
    "triggerSource": "PreSignUp_SignUp",
    "request": {
        "userAttributes": {
            "email": "john_smith@randommail.com"
        },
        "validationData": null
    },
    "response": {
        "autoConfirmUser": false,
        "autoVerifyEmail": false,
        "autoVerifyPhone": false
    }
}

我的问题

我正在寻找想法或示例,以使我的用户注册和登录不区分大小写。这可能包括改变我的lambda触发器方法或完全不同的其他方法。

请注意我知道我可以实现自己的用户界面,我只会作为最后的手段。

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:0)

您可以在注册后触发Lambda函数,以将电子邮件更改为小写。无需实际测试,您就可以trigger a Lambda post confirmation。 Lambda可以使用从您选择的SDK中调用的AdminUpdateUserAttributes API来将电子邮件更改为小写。

请注意,用户名也区分大小写。

答案 2 :(得分:0)

由于用户名区分大小写:为什么不只使用用户名作为电子邮件地址,并使用用户名在电子邮件字段中添加预钩子?

答案 3 :(得分:0)

创建帐户时,使用户名小写。登录时使用户名小写。至少通过这种方式,您只需要重新创建具有大写字符的用户即可。或者,您可以重建整个用户池并迁移用户,但是谁知道这会对密码和MFA产生什么影响。现有的用户池似乎不值得为此烦恼。希望您正在做一个全新的项目,并且在创建用户池时可以选择不区分大小写的选项。

答案 4 :(得分:-2)

另一种可能性是,如果您可以创建用户注册api,它将在cognito中创建用户。修剪电子邮件以及对电子邮件进行小写处理之后。您可以在此之前执行自定义步骤。

您是正确的,基本上是在执行注册后调用预注册触发器。

https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-sign-up.html#aws-lambda-triggers-pre-registration-tutorials