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
});
はい。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のプロパティ名に寄せる処理を間に入れています。