代码之家  ›  专栏  ›  技术社区  ›  F_SO_K

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

  •  35
  • F_SO_K  · 技术社区  · 8 年前

    安装程序

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

    enter image description here

    问题

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

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

    我所尝试的

    通常,在将电子邮件地址发送到服务器之前,在客户机中将其设置为小写,这样做很容易处理。但是,我无法访问客户端UI,因为它是由Cognito托管的。

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

    预注册

    当用户尝试时,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函数收到此事件时,似乎已经在userpool中创建了帐户。更改请求中的电子邮件地址无效-原始电子邮件地址(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触发器方法的更改或其他完全不同的内容。

    请注意,我知道我可以实现自己的UI,这只是我最后的选择。

    5 回复  |  直到 8 年前
        1
  •  6
  •   Mr. Young    6 年前
        2
  •  2
  •   bgdnlp    7 年前

    您可以在注册后触发Lambda函数,将电子邮件更改为小写。在不进行实际测试的情况下,您应该能够 trigger a Lambda post confirmation . Lambda可以用 AdminUpdateUserAttributes API ,从您选择的SDK调用,将电子邮件更改为小写。

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

        3
  •  0
  •   Naguib Ihab    6 年前

    既然用户名是区分大小写的:为什么不直接使用用户名作为电子邮件地址,并让prehook用用户名填充电子邮件字段?

        4
  •  0
  •   Timothy Gonzalez    5 年前

    创建帐户时将用户名设置为小写。登录时将用户名设置为小写。至少这样,您只需重新创建具有大写字符的用户。或者,您可以重建整个用户池并迁移用户,但谁知道这会对密码和MFA产生什么影响。现有的用户池似乎不值得这么麻烦。希望您正在执行一个全新的项目,并且在创建用户池时可以选择不区分大小写的选项。

        5
  •  -3
  •   Asad Mehmood    7 年前

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

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

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