amplify override authでCognitoの設定を上書きする

# Amplify cli で作成した Amazon Cognitoの設定をcdkで上書きする

- やろうとしていること
    - amplify cli で生成されるcloudformationではリフレッシュトークン最小設定が１日となる、１日未満の設定ができない
    - リフレッシュトークンを23時間にしてみる
    - Cognitoユーザープールでのユーザー追加を管理者のみ可能とする
- 試した時のバージョン
    - amplify cli 8.3.1
    - cdkの機能 override.ts を使い、１日未満の２３時間を設定してみる

### amplify cli でCognitoユーザープールの作成
```
amplify add auth
```

### 作成済のauthをoverrideする機能

- amplify cli 7.3 以降から可能な機能

```sh
amplify override auth 
```

- `amplify/backend/auth/{appnamedummy}/override.ts` が出来上がる
- 以下のようにtsを記載する

```override.ts
import { AmplifyAuthCognitoStackTemplate} from '@aws-amplify/cli-extensibility-helper';

export function override(resources: AmplifyAuthCognitoStackTemplate) {
  resources.userPool.adminCreateUserConfig = {
    allowAdminCreateUserOnly: true
  };
  
  resources.userPoolClientWeb.refreshTokenValidity = 23;

  resources.userPoolClientWeb.tokenValidityUnits = {
    accessToken: 'hours',
    idToken: 'hours',
    refreshToken: 'hours'
  };
}
```

- amplify cli で amplify push しようとすると、cfnファイルがビルド出力される。ここでcloudformationとしてチェック可能
    - amplify/backend/auth/{appnamedummy}/build/{appnamedummy}-cloudformation-template.json
```json
    "UserPoolClientWeb": {
      "Type": "AWS::Cognito::UserPoolClient",
      "Properties": {
        "UserPoolId": {
          "Ref": "UserPool"
        },
        "ClientName": "{appnamedummy}_app_clientWeb",
        "RefreshTokenValidity": 23,
        "TokenValidityUnits": {
          "AccessToken": "hours",
          "IdToken": "hours",
          "RefreshToken": "hours"
        }
      },
      "DependsOn": [
        "UserPool"
      ]
    },
```

- amplify cliで amplify push または amplify consoleでバックエンドビルドすると反映できる

---

## 説明
### リフレッシュトークンの設定
- `amplify override auth` のドキュメント https://docs.amplify.aws/cli/auth/override/
- override.tsでは、userPoolClientWeb（{appnamedummy}_app_clientWeb）を対象としているが, userPoolClientも必要に応じて設定する
- UserPoolclientと（userPoolClientWeb）で設定可能な[cloudformation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html)を参考に、

```json
  RefreshTokenValidity: Integer
  TokenValidityUnits: 
    TokenValidityUnits
```
となり、リフレッシュトークンに設定できるのは数値、単位は TokenValidityUnitsという型

- [CDKのドキュメント  TokenValidityUnits](https://docs.aws.amazon.com/cdk/api/v1/docs/@aws-cdk_aws-cognito.CfnUserPoolClient.TokenValidityUnitsProperty.html) では、以下のような型となる
```ts
const tokenValidityUnitsProperty: cognito.CfnUserPoolClient.TokenValidityUnitsProperty = {
  accessToken: 'accessToken',
  idToken: 'idToken',
  refreshToken: 'refreshToken',
};
```

accessToken,idToken,refreshTokenで指定可能なのは、“seconds”, “minutes”, “hours”, or “days”となる。リフレッシュトークン以外は、変更しないので、「hours」とし、refreshTokenを23時間にするため、daysではなく、「hours」とする。

- リフレッシュトークンの時間を23時間にするため、リフレッシュトークンの有効期間の数値を変更する

```ts
resources.userPoolClientWeb.refreshTokenValidity
```

- `userPoolClient`の方も設定するならば、以下のようなコードを必要
```ts
  resources.userPoolClient.refreshTokenValidity = 22;
  resources.userPoolClient.tokenValidityUnits = {
    accessToken: 'hours',
    idToken: 'hours',
    refreshToken: 'hours'
  };

```

#### 設定した反映を確認

- <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/d49e85f9-b0e3-e5e4-a7eb-5fd5f00b2757.png" width ="500" />

- <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/142dfe2d-5f92-93e6-3e5f-8b6ce409f047.png" width="500" />




### ユーザープールへのユーザー情報「管理者のみにユーザーの作成を許可する」に変更する

- 「ユーザーに自己サインアップを許可する」をやめる
- リフレッシュトークンの反映と同じoverride.tsに以下を追記する
```ts
  resources.userPool.adminCreateUserConfig = {
    allowAdminCreateUserOnly: true
  };
```

- amplify/backend/auth/{appnamedummy}/build/{appnamedummy}-cloudformation-template.json には以下が反映される
```json
  "Resources": {
    "UserPool": {
      "Type": "AWS::Cognito::UserPool",
      "Properties": {
        "AdminCreateUserConfig": {
          "AllowAdminCreateUserOnly": true
        },
```


- リフレッシュトークンの反映と一緒に反映される

#### マネジメントコンソールで設定反映後を確認

- AWSマネジメントコンソールの新しいコンソール、サインアップエクスペリエンスの設定画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/52c3db52-dfbe-8c2e-bc73-1e0aa28dbd66.png)

- AWSマネジメントコンソールの古いマネジメントコンソールの設定画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/9be15517-cec8-c30e-29ff-9c9099547bea.png)