web-dev-qa-db-ja.com

AWS Cognitoユーザー名/メールログインでは大文字と小文字が区別されます

セットアップ

AWS Cognitoを使用して、ウェブアプリケーションのユーザー登録とユーザーアクセスを管理しています。具体的には、CognitoホストUIを使用しています。これは、Cognitoがユーザーに登録するUIを提示することを意味します。ユーザーのサインアップまたはアプリケーションのログインページを変更するアクセス権はありません(Cognitoが提供するコントロール以外)。メールアドレスをユーザー名として使用しているため、新しいユーザーはメールアドレスとパスワードの入力を求められるだけです。

enter image description here

問題

Cognitoは、メールアドレスを大文字と小文字を区別するものとして扱います。ユーザーがメールアドレス[email protected]でサインアップすると、john_smith @ randommail.comを使用してサインインできなくなります。

サインアップとログイン用のユーザーのメールアドレスで大文字と小文字を区別しないようにします。

私が試したこと

通常、これは、サーバーに送信する前にクライアントでメールアドレスを小文字に設定することで対処するのは簡単です。ただし、クライアントUIはCognitoでホストされているため、アクセスできません。

したがって、私の計画では、 Cognito事前サインアップトリガー によって呼び出される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);
};

これは、イベントリクエストの電子メールアドレスが小文字([email protected])に変更されたという意味で「機能しました」。ただし、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
    }
}

私の質問

ユーザー登録とログイン大文字と小文字を区別しないアイデアや例を探しています。これには、ラムダトリガーアプローチの変更などが含まれます。

私は自分のUIを実装できることを知っていることに注意してください。これは最後の手段としてのみ行います。

23
F_SO_K

サインアップ後にLambda関数をトリガーして、メールを小文字に変更できます。実際にテストすることなく、 Lambdaの投稿確認をトリガーする ができるはずです。 Lambdaは、選択したSDKから呼び出される AdminUpdateUserAttributes API を使用して、メールを小文字に変更できます。

ユーザー名でも大文字と小文字が区別されることに注意してください。

1
bgdnlp

ユーザー名は大文字と小文字が区別されるため、なぜユーザー名をメールアドレスとして使用し、preフックでメールフィールドにユーザー名を入力しないのですか?

0
Naguib Ihab