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

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

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


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

[](#はじめに
前提として、この記事に書いてあることはよくよく見れば公式ドキュメントを見れば書いてあるようなことですが、
Amazon Cognitoの膨大な量のドキュメントから探すのは面倒だよ！という人のために書いています。
)
[](#Amazon Cognitoの標準属性とカスタム属性とは
)
[](Amazon Cognitoではサインアップ、サインイン機能を作るために、ユーザープールと呼ばれるユーザーディレクトリを作成します。)
[](・標準属性は、ユーザープール作成時に、サインアップするために必須の項目(メールアドレスや性別、誕生日など）として選択するもので、***作成後に要件の変更は行えません***。)
・カスタム属性は、削除はできませんが後から追加することがきる属性です。)


[](#つまずくまでの流れ
一応AWS CLIでのCognitoユーザー作成の部分もメモしておきます。)
[](###ユーザー作成
筆者はユーザープールを作成した時に、ログインに必須の標準属性として、メールアドレスを選択しました。
ニックネーム的なものも自由に登録できるようにしたかったので、カスタム属性を作成。
![7fb9b90e1fef0b286fc81e21d2bd0826[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/1795006b-1236-2e6b-9b60-87cebffe598a.png)
AWS CLIで以下のコマンドを打ち、動作確認テスト用のアカウントを作成
)


[](
```
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
```
ユーザーの作成は完了しましたが、赤で囲った部分
![Inked280d3c7a0d78505351f2684a8b212d60[1]_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/86c8d9cd-4f92-e908-2ebb-fa4c22531be6.jpeg)
赤字で囲ったFORCE_CHANGE_PASSWORDのままだとまずいので、以下のコマンドでパスワードを設定。
```
aws cognito-idp --permanent admin-set-user-password --user-pool-id {ユーザープールID} \
--username {ユーザーネーム} --password {パスワード}
```
)

#AWS CLIでカスタム属性を含むユーザーを作成
AWSマネジメントコンソールから以下のようなカスタム属性を追加。
![7fb9b90e1fef0b286fc81e21d2bd0826[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/0054c3a5-d572-026a-08b8-639e7adb773c.png)

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

***・ユーザーを作成***

```
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 {パスワード}
```

<br><br>
##作成したユーザーの属性情報を確認
***・CLI上で属性情報を確認***
![teisei.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/bb09d5c5-83b9-8834-791a-71bf83f4b2db.jpeg)


***・マネジメントコンソール上で属性情報を確認***
![teisei2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/88938bf7-2c05-2007-806e-3923813fe052.jpeg)

CLIとマネジメントコンソール上ではしっかりカスタム属性の「custom:name_user テストそら」も表示されているのでうまくいっています。
<br><br><br>
#Web上ではカスタム属性の取得に失敗
Web上でログイン機能はすでに実装してあったので、ログインしたユーザー(CLIで作成したユーザー)の***属性情報をgetUserAttributes関数で全て取得***し、コンソールに表示してみました。
<br>

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

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

<br>
***・コンソールログで属性情報を確認***
![Inked7b85eb2b9f2f04d7b30faeec8cbe4b83[1]_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/fdb4247f-2161-6712-1b33-7e67419c30c2.jpeg)

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

特になんのエラーも出ていないので結構困ったことになりました。
#原因
[stackoverflowでのQ＆A](https://stackoverflow.com/questions/48700030/custom-attributes-missing-in-the-getuserattributes-response-aws-cognito)
[AWS公式ドキュメント](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-settings-attributes.html)

これらによるとどうやら***アプリクライアントにカスタム属性へのアクセス権限がない***ことが原因のようです。
#解決方法
##アプリクライアントにカスタム属性への読み取り権限を与える
・マネジメントコンソールからCognitoのユーザープールを開き、「アプリクライアント」タブの「詳細を表示」をクリック
![Inked1ban_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/34e7e725-3485-c434-16ca-b0910fa61c2f.jpeg)
・次に「属性の読み込みおよび書き込みアクセス権限を設定する」をクリック
![2ban.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/885c7d54-8a36-3a2a-9fdd-fa1706a24fe5.jpeg)
・読み取りを許可したいカスタム属性にチェックを入れ、「アプリクライアントの変更を保存」をクリック
![3ban.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/9f35ee11-b635-631d-97be-13eaf82da91d.jpeg)
<br>
これで権限設定は完了です。
あらためて属性情報取得し、コンソールログで見てみると、
![4ban.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/caec64db-e7ba-15e0-7651-07966be54522.jpeg)
カスタム属性を取得することができました。
#まとめ
原因がわかれば「なんだこれだけか」というようなものでしたが、
標準属性に対するアクセス権限はデフォルトで与えられていて、特に設定した覚えもなかったので、
カスタム属性に対するアクセス権限がないことが原因だとは中々気づくことができませんでした。

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

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