当前位置: 首页 > 知识库问答 >
问题:

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

柴飞扬
2023-03-14

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

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

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

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

因此,我的计划是尝试使用由Cognito预注册触发器调用的Lambda函数来小写用户提供的电子邮件。

预先报名

当用户试图注册(注册)时,AmazonCognito调用此触发器,允许您执行自定义验证以接受或拒绝注册请求。

以下是我编写的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,这只是我最后的选择。

共有3个答案

晏正豪
2023-03-14

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

袁玮
2023-03-14

您可以在注册后触发Lambda函数,将电子邮件更改为小写。无需实际测试,您应该能够触发Lambda后确认。Lambda可以使用从您选择的SDK调用的AdminUpdateUserAtinites API将电子邮件更改为小写。

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

柯阳曦
2023-03-14

修复了新用户池。现在可以关闭区分大小写功能。

https://aws.amazon.com/about-aws/whats-new/2020/02/amazon-cognito-user-pools-service-now-supports-case-insensitivity-for-user-aliases/

 类似资料:
  • 我已经实现了登录用户名或电子邮件在我现有的项目和工程罚款。我想将其扩展为使用用户名、电子邮件或电话登录。我想要一个用户登录用户名,电子邮件或电话号码和密码。 这是我的代码App\Http\Controllers\Auth\LoginController 应用程序\Http\控制器\Auth\注册控制器 注册工作正常,我可以将用户电话存储到用户表中。我已将电子邮件的输入类型更改为views/auth

  • 我希望身份验证组件允许用户登录输入用户名或电子邮件。在我的用户表中,两个字段-userName和userEmail都是唯一的。注册时,密码生成如下: sha1($username.$password); 问题是用户无法使用电子邮件登录。 应用程序控制器 用户控制器:登录功能如下: Auth。php:(我在这里对生成密码的方式做了一些更改,因为我正在使用cakephp会话自动登录到SMF论坛。) 我

  • 问题内容: 我希望django通过电子邮件而非用户名对用户进行身份验证。一种方法是提供电子邮件值作为用户名值,但我不希望这样。原因是,我有一个,所以我不能有一个。 另一个原因是所有电子邮件都是唯一的,但有时用户名已被使用。因此,我将自动创建用户名为。 我该如何更改才能让Django通过电子邮件进行身份验证? 这就是我创建用户的方式。 这就是我的登录方式。 除了先获取用户名外,登录还有其他方法吗?

  • 我希望django通过电子邮件而不是用户名来验证用户。一种方法是提供电子邮件值作为用户名值,但我不希望这样。原因是,我有一个url

  • 问题内容: 我正在尝试创建一个auth后端,以允许我的用户使用他们的电子邮件地址或他们在Django 1.6中使用自定义用户模型的用户名登录。当我使用用户名登录时,后端工作正常,但由于某种原因,没有电子邮件。有什么我忘记要做的事吗? 编辑:按照建议,我已从ModelBackend继承并将其安装在我的设置中。在我的设置中,我有这个(,)并且我将后端更改为这个: 现在我得到一个错误。 问题答案: 遵循

  • 我正在尝试使用Swift从iOS中的google登录API中查找登录帐户的电子邮件。我使用的代码与google开发者说明页面中给出的代码相同。 这是我的密码 description=[NSString stringAnd Format: @"%@ %@ %@ %@ %@ %@", person.display名称,person.gender,person.ageRange.min,person.a