Cognito User Poolsでユーザー名とEmailのどちらからでもユーザー情報を取得できるようにする

タイトルの通りです。 背景 Cognito User Poolsはログイン時のIDにユーザー名・Email・電話番号の3つが利用できます。これはプールを作成する際にしか設定できませんので、これから試そうという方はご注意 […]

広告ここから
広告ここまで

目次

    タイトルの通りです。

    背景

    Cognito User Poolsはログイン時のIDにユーザー名・Email・電話番号の3つが利用できます。これはプールを作成する際にしか設定できませんので、これから試そうという方はご注意ください。

    で、バックエンドを実装している時にちょっと困るのが、adminGetUser関数の挙動だったりします。ちょっとドキュメントを見てみましょう。

    var params = {
      UserPoolId: 'STRING_VALUE', /* required */
      Username: 'STRING_VALUE' /* required */
    };
    cognitoidentityserviceprovider.adminGetUser(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
    });

    form: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html#adminGetUser-property

    はい。getではUsernameからしか取得できません。

    ですがやはりEmail / 電話番号からユーザー名をひきたくなる時もありますので、こんな感じにしてやるとよさそうです。

    Username / Emailどちらからでもひけるようにするヘルパー

    username / emailどちらがくるかわからない想定なので、eventオブジェクトを拾ってそこから値を見る形にしています。

    const AWS = require('aws-sdk')
    const cognitoidp = new AWS.CognitoIdentityServiceProvider();
    
    const getUser = async (event) => {
      const UserPoolId = process.env.USERPOOL_ID
      const Username = event.userName
    
      if (Username) {
          const getParams = {
            UserPoolId,
            Username
          }
          const user = await cognitoidp.adminGetUser(getParams).promise()
          // listUserはAttributesだけどadminGetUserはUserAttributesなので、プロパティを揃える
          if (!user.Attributes && user.UserAttributes) user.Attributes = user.UserAttributes
          return user
      } else {
          const params = {
            UserPoolIdd,
            Limit: 60,
            Filter: `email="${event.email}"`
          }
          const { Users } = await cognitoidp.listUsers(params).promise()
          if (Users && Users.length <= 0) {
            throw new Error('User not found')
          }
          return Users[0]
      }
    }

    listUserとadminGetUserで、userAttributesのプロパティ名が異なるので注意してください。今回のサンプルでは、listUserのプロパティ名に寄せる処理を間に入れています。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark