Amazon Cognitoカスタム属性を追加する時に気をつけること


最近Amazon Cognitoでログイン機能を実装して遊んでいたのですが、
ユーザープールにカスタム属性を追加したところ、AWS CLIやマネジメントコンソール上ではカスタム属性情報の取得ができるのに、
Web上でAmazon CognitoのjavaScriptライブラリを使い、getUserAttributes関数で属性情報を取得したところ、何故かカスタム属性だけ取得できないということがありました。

なので、getUserAttributes関数でカスタム属性を取得する方法についてメモしておきます。

解決方法だけ見たい方はこちら (アプリクライアントにカスタム属性への読み取り権限を与える)





AWS CLIでカスタム属性を含むユーザーを作成

AWSマネジメントコンソールから以下のようなカスタム属性を追加。



AWS CLIで以下のコマンドを打ち動作確認用のアカウントを作成し、2つ目のコマンドでパスワードを設定しました。

・ユーザーを作成

aws cognito-idp admin-create-user --user-pool-id {ユーザープールID} \
--username {ユーザーネーム} --user-attributes Name=email,Value={メールアドレス} \
Name=email_verified,Value=True Name=custom:name_user,Value=テストそら \ 
--desired-delivery-mediums EMAIL

・パスワードを設定

aws cognito-idp --permanent admin-set-user-password \
--user-pool-id {ユーザープールID}--username {ユーザーネーム} --password {パスワード}



作成したユーザーの属性情報を確認

・CLI上で属性情報を確認

・マネジメントコンソール上で属性情報を確認

CLIとマネジメントコンソール上ではしっかりカスタム属性の「custom:name_user テストそら」も表示されているのでうまくいっています。



Web上ではカスタム属性の取得に失敗

Web上でログイン機能はすでに実装してあったので、ログインしたユーザー(CLIで作成したユーザー)の属性情報をgetUserAttributes関数で全て取得し、コンソールに表示してみました。

・コンソールに表示させる部分

cognitoUser.getSession(function(err, session) {
  if (err) {
    console.log(err)
  } else {
    cognitoUser.getUserAttributes(function(err, result) {
      if (err) {
        console.log(err)
      }
      console.log(result)
    })
  }
})



・コンソールログで属性情報を確認

カスタム属性だけ取得できてないじゃん!!!!
emailやemail_verifiedなどの標準属性のみを取得していてカスタム属性が取得できていません。

特になんのエラーも出ていないので結構困ったことになりました。

原因

stackoverflowでのQ&A
AWS公式ドキュメント

これらによるとどうやらアプリクライアントにカスタム属性へのアクセス権限がないことが原因のようです。

解決方法

アプリクライアントにカスタム属性への読み取り権限を与える

・マネジメントコンソールからCognitoのユーザープールを開き、「アプリクライアント」タブの「詳細を表示」をクリック

・次に「属性の読み込みおよび書き込みアクセス権限を設定する」をクリック

・読み取りを許可したいカスタム属性にチェックを入れ、「アプリクライアントの変更を保存」をクリック



これで権限設定は完了です。
あらためて属性情報取得し、コンソールログで見てみると、

カスタム属性を取得することができました。

まとめ

答えがわかってしまえば「なんだこれだけか」というようなものでしたが、
標準属性に対するアクセス権限はデフォルトで与えられていて、特に設定した覚えもなかったので、
カスタム属性に対するアクセス権限がないことが原因だとは中々気づくことができませんでした。

察しの良い方や、AWSに触りなれている方でしたら、「権限の問題かな」とすぐわかりそうなものですが筆者は完全初心者なので思わぬ落とし穴でした。

エラー文が特に出ていないので原因を探るのも少し大変でした。
困っている方の助けになればうれしいです。