Вход пользователя имени пользователя/электронной почты AWS Cognito чувствителен к регистру

Настройка

Я использую AWS Cognito для управления регистрацией пользователей и доступа пользователей к моему веб-приложению. В частности, я использую пользовательский интерфейс, управляемый Cognito. Это означает, что Cognito представляет пользовательский интерфейс для моих пользователей для регистрации, у меня нет доступа для изменения страниц регистрации или входа в систему для моего приложения (кроме элементов управления, предоставляемых Cognito). Я использую адреса электронной почты в качестве имен пользователей, поэтому новым пользователям просто предлагается указать адрес электронной почты и пароль.

введите описание изображения здесь

Проблема

Cognito обрабатывает адреса электронной почты как чувствительные к регистру. Если пользователь подписывается с адресом электронной почты [email protected], они не могут войти в систему, используя [email protected]

Я хочу, чтобы пользовательские адреса электронной почты для регистрации и входа были нечувствительны к регистру.

Что я пробовал

Обычно это было бы тривиально иметь дело, задав адрес электронной почты в нижнем регистре клиента, прежде чем отправлять его на сервер. Однако у меня нет доступа к пользовательскому интерфейсу клиента, поскольку он размещен Cognito.

Таким образом, мой план состоял в том, чтобы попытаться использовать функцию Lambda, вызванную Cognito pre-signup триггером, чтобы прописать письмо, предоставленное пользователем.

Предварительная регистрация

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);
};

Это "работало" в том смысле, что адрес электронной почты в запросе события был изменен как строчный ([email protected]). Тем не менее, похоже, что учетная запись уже создана в userpool к моменту, когда моя функция Lambda получит это событие. Изменение адреса электронной почты в запросе не повлияло - исходный адрес электронной почты ([email protected]) по-прежнему отображается в моем пуле пользователей. Я подозреваю, что единственные поля в событии, которые имеют какой-либо эффект, являются полями ответа. Вот как выглядит мое измененное событие:

{
    "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": "[email protected]"
        },
        "validationData": null
    },
    "response": {
        "autoConfirmUser": false,
        "autoVerifyEmail": false,
        "autoVerifyPhone": false
    }
}

Мой вопрос

Я ищу идеи или примеры, чтобы сделать мою регистрацию пользователя и логин без учета регистра. Это может включать изменения в моем методе лямбда-триггера или что-то еще.

Обратите внимание, что я знаю, что могу реализовать свой собственный пользовательский интерфейс, который я буду делать только в крайнем случае.

Ответ 1

Это не работает для IU.

Возможное грязное решение для компонентов усиления должно заключаться в уменьшении значения размытия.

var x = document.getElementsByClassName("Input__input___2Sh1s");
if (x && x[0] && x[0].getAttribute('name') == 'username') {
  let usernameField: any = x[0]
  usernameField.addEventListener("blur", () => {
    usernameField.value = "" + usernameField.value.toLowerCase()
  });
}

Пожалуйста, имейте в виду, что класс CSS может отличаться в других платформах. Мы использовали реакцию амплификации.

Ответ 2

Вы можете активировать функцию Lambda после регистрации, чтобы изменить адрес электронной почты на строчные. Не проверяя его, вы сможете вызвать подтверждение лямбда-поста. Чтобы Lambda могла использовать API AdminUpdateUserAttributes, вызываемый из вашего SDK, вы можете изменить адрес электронной почты на строчные.

Обратите внимание, что имена пользователей также чувствительны к регистру.

Ответ 3

Поскольку в имени пользователя учитывается регистр символов: почему бы просто не использовать имя пользователя в качестве адреса электронной почты и не заполнить поле ввода имени пользователя предварительным крюком?

Ответ 4

другая возможность, если вы можете создать API регистрации пользователя, который бы создал пользователя в Cognito. после обрезки электронной почты вместе с выполнением строчных букв на электронной почте Вы можете выполнить свои собственные шаги до этого.

Вы правы, что триггер предварительной регистрации в основном вызывается после выполнения регистрации.

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