Cognitoをローカル環境で動かしてみる

# 結論 (Cognitoをローカルで起動するコマンド)

```bash
docker run -d -p 5000:5000 --name cognito-idp-local motoserver/moto:latest cognito-idp
```

# 注意事項

[moto](https://github.com/spulec/moto)というAWS Serviceを擬似環境で動かせるライブラリを使用しておりますが、全ての操作はサポートされておりませんのでお気をつけください。
(以下の「簡易的なチュートリアル」で行う操作はサポートされていることを確認済です。)


# 簡易的なチュートリアル

## 前提条件

- Dockerがインストールされていること。
- AWS CLIがインストールされていること。

## 大まかな流れ

- ローカル用のAWS CLIプロファイル設定
- Cognitoの起動
- ユーザープールの作成
- アプリクライアントの作成
- ユーザーの作成
- ユーザーの認証

## 手順

### ローカル用のAWS CLIプロファイル設定

```
aws configure --profile=local
```

設定は下記の通りですが、変更していただいてもかまいません。

```
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: ap-northeast-1
Default output format [None]: 
```

### Cognitoの起動

```bash
docker run -d -p 5000:5000 --name cognito-idp-local motoserver/moto:latest cognito-idp
```

### ユーザープールの作成

```bash
USER_POOL_ID=$(
  aws cognito-idp create-user-pool \
    --pool-name MyUserPool \
    --query UserPool.Id \
    --output text \
    --profile local \
    --endpoint-url http://localhost:5000 \
)
```

### アプリクライアントの作成

```bash
CLIENT_ID=$(
  aws cognito-idp create-user-pool-client \
    --client-name MyUserPoolClient \
    --user-pool-id ${USER_POOL_ID} \
    --query UserPoolClient.ClientId \
    --output text \
    --profile local \
    --endpoint-url http://localhost:5000 \
)
```

### ユーザー情報変数の設定

```bash
COGNITO_USER_NAME=yamada-dummy
COGNITO_USER_EMAIL=dummy_yamada@sample.xxx.com
COGNITO_USER_PASSWORD=p@ssw0rd
```

### ユーザーの作成

```bash
aws cognito-idp admin-create-user \
  --user-pool-id ${USER_POOL_ID} \
  --username ${COGNITO_USER_NAME} \
  --user-attributes Name=email,Value=${COGNITO_USER_EMAIL} Name=email_verified,Value=true \
  --message-action SUPPRESS \
  --profile local \
  --endpoint-url http://localhost:5000
```

下記のように出力されますが、`"UserStatus": "FORCE_CHANGE_PASSWORD"`となっているため、
次の手順でパスワードを設定します。

```
{
    "User": {
        "Username": "yamada-dummy",
        "Attributes": [
            {
                "Name": "email",
                "Value": "dummy_yamada@sample.xxx.com"
            },
            {
                "Name": "email_verified",
                "Value": "true"
            }
        ],
        "UserCreateDate": 1632556280.0,
        "UserLastModifiedDate": 1632556280.0,
        "Enabled": true,
        "UserStatus": "FORCE_CHANGE_PASSWORD",
        "MFAOptions": []
    }
}
```

### ユーザーのパスワード設定

```bash
aws cognito-idp admin-set-user-password \
  --user-pool-id ${USER_POOL_ID} \
  --username ${COGNITO_USER_NAME} \
  --password ${COGNITO_USER_PASSWORD} \
  --permanent \
  --profile local \
  --endpoint-url http://localhost:5000
```

とくに何も出力されないので、次の手順でちゃんと設定できたか確認します。

### ユーザー設定の確認

```bash
aws cognito-idp list-users \
  --user-pool-id ${USER_POOL_ID} \
  --profile local \
  --endpoint-url http://localhost:5000
```

下記のように出力されますが、`"UserStatus": "CONFIRMED"`となっていればOKです。

```
{
    "Users": [
        {
            "Username": "yamada-dummy",
            "Attributes": [
                {
                    "Name": "email",
                    "Value": "dummy_yamada@sample.xxx.com"
                },
                {
                    "Name": "email_verified",
                    "Value": "true"
                }
            ],
            "UserCreateDate": 1632556280.0,
            "UserLastModifiedDate": 1632556280.0,
            "Enabled": true,
            "UserStatus": "CONFIRMED",
            "MFAOptions": []
        }
    ]
}
```

### ユーザーの認証

```bash
aws cognito-idp admin-initiate-auth \
  --user-pool-id ${USER_POOL_ID} \
  --client-id ${CLIENT_ID} \
  --auth-flow ADMIN_NO_SRP_AUTH \
  --auth-parameters "USERNAME=${COGNITO_USER_NAME},PASSWORD=${COGNITO_USER_PASSWORD}" \
  --profile local \
  --endpoint-url http://localhost:5000

```

下記のように出力されたら成功です！

```
{
    "AuthenticationResult": {
        "AccessToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImR1bW15IiwidHlwIjoiSldUIn0.eyJpc3MiOiJodHRwczovL2NvZ25pdG8taWRwLmFwLW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20vYXAtbm9ydGhlYXN0LTFfMzNhYTAxOTNmYjZjNGE4Y2JhODAwODc4NzQ1YmM3Y2MiLCJzdWIiOiJiNDU3NWZkYi01MmExLTQ3NjEtODYyMi05MGFhZjA2ZTFmMDEiLCJhdWQiOiJ2ODU0N21qN2dheW50ZXp5a2tydzRuMHgyOSIsInRva2VuX3VzZSI6ImFjY2VzcyIsImF1dGhfdGltZSI6MTYzMjU1NjQ4NiwiZXhwIjoxNjMyNTYwMDg2LCJlbWFpbCI6InlhbWFkYS1kdW1teSJ9.Z-icBrXiic6NSbp9boT2_UM1dUNtk5LipWawp54Enc1vZxeOveLrBSCm6vKmsazyVIkZSDbYOOQ5uIxsk0Ws5n7RojIO8lSmn1pfi_Kv5G49VovZmg41E_9j7mR5Jnyzrpi1aqUKW_9TKseujFTwOZrns4v5P7Bk98QLz_HVEwBa1Lo3rM8f3QkZKG6dn4Im2P7SOOKjRl27mqGDHeHJD9cpy20llXkDmTmDaEPL7q04JmbkhmyjG9AKEBpkKVwePokOt0jxV7qOf-mRIYjk-cdd0efeRUjrR25EEjFTVw-nN4YyO6uQlBldbhOEcNKowamsPZeg6ZNRrtGdtcN_AQ",
        "ExpiresIn": 3600,
        "RefreshToken": "07003202-3727-40ee-b58c-4e031d963ef3",
        "IdToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImR1bW15IiwidHlwIjoiSldUIn0.eyJpc3MiOiJodHRwczovL2NvZ25pdG8taWRwLmFwLW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20vYXAtbm9ydGhlYXN0LTFfMzNhYTAxOTNmYjZjNGE4Y2JhODAwODc4NzQ1YmM3Y2MiLCJzdWIiOiJiNDU3NWZkYi01MmExLTQ3NjEtODYyMi05MGFhZjA2ZTFmMDEiLCJhdWQiOiJ2ODU0N21qN2dheW50ZXp5a2tydzRuMHgyOSIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMyNTU2NDg2LCJleHAiOjE2MzI1NjAwODYsImVtYWlsIjoieWFtYWRhLWR1bW15In0.JwCdj1WJiWg8hQGwJ10GXyJiFMB1k-cvq6nJHwjqbm6CGwnFGrZQuBpugQBun3WAjHYxH1EGNO8rNMd6TUNkdCaH39WeiFOUC6TUlhzS2dxvbKEzXQazphevl5u2HIF0E5U_jSMaLoWlJSUF9yR2LPgr5ivk4omxKspL5bkZqSWWfhkJBWUk-1359Mq-CRonkB9zEGOH-3rwgRewHzs2WvTc29p67N3tTQAh38hh2tJRjMvDeCe5v98O3FSzCWiGIMyekQMaLZIP13OD6vmb_hWjcW1i2c6-FVKscDkbfZuBhIah5AIIaTp5LluaoeoUDGPg8l4c1HDgIknjapchFg"
    }
}
```