Amazon Cognito 再学習

## ユーザープールを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/0a3423b0-e767-30e5-0afb-2361c4e4ee7e.png)

### 認証プロバイダー
ここでの選択肢としては、プロバイダーのタイプを最初に定義する。
Cognitoを用いてIDを認証する場合はユーザープールを。外部のIDを用いて認証を行う場合はフェデレーテッドアイデンティティプロバイダーのチェックを入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/a998f556-d13e-69c6-49fc-43e642f655f4.png)

現時点でフェデレーテッドサインインの選択肢としては以下のものがある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/55233b49-2146-b2a0-4551-174240d4dd1f.png)

### セキュリティ要件
セキュリティ要件としてはパスワードポリシー、他要素認証、パスワード忘れによる復旧方法の選択を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/3fef406b-fc92-72cf-0423-9db44b44ad59.png)

他要素認証の選択肢としては、必須が推奨されている。
ただ、アプリケーションにもよるとは思うけれど、個人的にはオプションかな、とは思う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/1e8505f8-4b6a-642e-ade4-b849c4d169c0.png)

MFAの方法として説明書きがあるTOTPはタイムベースドワンタイムパスワードの略で、Authenticatorみたいな認証アプリのよくある仕組みのことを指していた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/61695eb2-65a5-6949-6ef2-f3f1fa14667c.png)

ユーザーアカウントの復旧に関しては、パスワード紛失時に管理者の操作を必須とするかどうかを選択させる形。
基本的にはユーザーによるセルフ復旧が一般的ではあるけれど、セキュリティ要件の高いアプリケーションの場合は再発行を簡単に許可してはいけない場合もあるので、管理者によるパスワードリセット行為を強要させることができる選択肢が提供されている。

## サインアップエクスペリエンス
サインアップエクスペリエンスとして最初の項目は、自己登録を許すか、ということだ。
注意書きにある通り、有効状態の場合はパブリックにアプリケーションを公開した瞬間に誰でもアプリケーションを使えるようになってしまう。
ベータテストじゃないが、何かしら制限をかけたい場合には無効にしておくのがいいように感じる。
書きっぷりかすると、後からも変更できるのではないかと思われる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/a0882ee5-2074-7270-c2a8-83c81fd77b02.png)

それ以外の項目としては、Cognito側でEメール送信することでアカウントの検証等を行うことを許可するかどうかということのようだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/e222681f-ea9a-5be4-9a33-8dc85774cab7.png)
ちょっと気になったのは、ユーザーの必須属性。
このタイミングで必須項目を設定しないと行けないらしい。

もちろん、アプリケーション的に何処かで制御をかけることはできるかもしれないけれど、ユーザーマスタの設計に関しては注意が必要そうだ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/5947260f-d7cb-d066-8790-3bb50155236e.png)

設定はいくつかあるが、ぱっと見ると名前くらいかな～という気がしないでもない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/d9540d83-a606-e2e7-8752-921ae040dc16.png)

カスタム属性に関しても、ユーザープール作成後に名前の変更はできないとある。
名前の変更ができないだけで、カスタム属性の追加はできるのだろうから、この時点で慌てる必要はないようにも感じる

## メッセージ配信設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/47e6d692-5783-603f-3793-5d09497aa015.png)

Eメールの配信を何を用いるかを設定する事ができる。
AWSで考えると、Eメールプロバイダーは間違いなくSESなんだけど、SESでメールを配信するためにはドメインだとかの設定が必要になってしまう。

簡易的に済ますのであればCognitoにやってもらうのがいいが、この場合は一日あたり50件という制限がつくようだ。

## フェデレーテッドアイデンティティプロバイダ設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/06cb57c4-a2c5-a128-0443-b7f07c0a922a.png)

サインインのオプションとして外部ID連携を選択していると対象のプロバイダ設定を行う事ができる。

## アプリケーション統合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/a4ce0fa7-4586-51f0-8b97-2b12c7392d5c.png)

ユーザープール名を指定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/3de1f4c3-7a6e-a040-f64f-f6f6db6fccb1.png)

ドメイン名はホストされたCognitoによるページのURLを独自ドメインにするためにある。
必須入力項目なので、かぶらない名前を指定する必要がある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/e3790da1-236c-dabe-b167-03f15cbd6b46.png)

アプリケーションのタイプは「パブリッククライアント」が多く、アプリケーションクライアント名は。。。どこで使われるんだろう？
メールとかかな。

許可されているコールバックURLも指定する必要がある。
Reactアプリケーションであれば、一旦こちらは「localhost:3000」とかでもOKのようだ

クライアントシークレットは、クライアント側でシークレットを保持する場合は～とあるが、あまり意識はしなくても良さそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/7ee15ab4-708a-6be0-2c40-1a1c75c85012.png)

高度なアプリケーションクライアントの設定としては、認証フローを選択することができる。
それぞれの選択肢の意味としては下記のようだ

- USER_SRP_AUTH
    - Secure Remote Password (SRP) プロトコルの認証フロー。アプリケーションはユーザーのユーザー名とパスワードを収集し、プレーンテキストの認証情報の代わりに Amazon Cognito に渡す SRP を生成します。
- REFRESH_TOKEN_AUTH および REFRESH_TOKEN 
    - 有効な更新トークンから新しいアクセストークンと ID トークンを生成する認証フロー。
- CUSTOM_AUTH
    - カスタムチャレンジと予想されるレスポンスを定義する Lambda 関数を作成する、カスタマイズされた認証フロー。
- USER_PASSWORD_AUTH 
    - SRP 以外の認証フロー
    - アプリケーションはユーザー名とパスワードを Amazon Cognito に直接渡します。Amazon Cognito がユーザープールでユーザー名を見つけられないときに、ユーザー移行 Lambda トリガーをユーザープールに割り当てると、Amazon Cognito はユーザー移行 Lambda 関数を呼び出します。
- ADMIN_USER_PASSWORD_AUTH 
    - 管理者ベースのユーザーパスワード認証フロー。Amazon Cognito は、SRP プロセスを使用してパスワードを検証する代わりに、リクエストでパスワードを受け取ります。

## 確認
最後にこれまでの登録内容を確認して作成すればユーザープールの作成が完了した。

次は簡単なReactアプリケーションを作って実際に動かしてみようと思う