AWS Cognitoをとりあえず始めてみる方法について雑に書いていきます。

IDプールとユーザプール


まず、AWS Cognitoには大きく分けてIDプールとユーザプールの2つがあります。

IDプール

Cognito ID プールを使用すると、アプリは匿名ゲストユーザーおよびサインインしたユーザー用に AWS のサービスにアクセスするための一時的な認証情報を取得できます。

とAWSのコンソールに記載してあるので要するにAWSのリソースにアクセスするためのサービスだと思います。今回は扱わないので省略。

ユーザープール

今回取り扱うのはこちらですが、ディレクトリサービス(LDAP)やrealm(セキュリティの情報を格納するようなやつ)に近いという認識でよいと思います。もっと雑に書くと、一般的なシステムのユーザーテーブルにセキュリティのルールが加わったものぐらいの認識で良いと思います。

ユーザープールの作成


実際にユーザープールを作成していきます。ステップに従ってをやるとハマるのでとりあえず「デフォルトを確認する」で変えたいところだけ変えていきます。

一般的にユーザを一意に認識するためにemailを必須にすることは多いと思いますが、今回は代わりにnameを必須にします。

変更が終わると「プールの作成」を選択します。ユーザプールのIDとARNを控えます。(後でも確認できます)

次に左側のメニューからユーザを作成する(CLIでも可能ですがコンソールから実施します)

ここでのパスワードは後で強制変更させられるのでとりあえず適当でOKです。

testユーザが作成されましたが、ステータスはFORCE_CHANGE_PASSWORDで、実際にこのユーザーを使うにはこの後パスワードの変更が必要です。

アプリクライアントの設定


次にこのユーザープールをアプリクライアントを作ります。この時に「クライアントシークレットを生成せず」かつ「ADMIN_NO_SRP_AUTH」を選択します。

ユーザーのパスワード変更する


まず、初めにパスワードを変更しないといけないのでCLIで変更します。今までの内容を入力して下記のコマンドを実行します。

1
2
3
4
5
$ aws cognito-idp admin-initiate-auth \
--user-pool-id <user_pool_id> \
--client-id <your_client_id> \
--auth-flow ADMIN_NO_SRP_AUTH \
--auth-parameters USERNAME=<username>,PASSWORD=<password>

これを実行すると、次のようなJSONが返ってくる

1
2
3
4
5
6
7
8
9
{
"ChallengeName": "NEW_PASSWORD_REQUIRED",
"Session": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ChallengeParameters": {
"USER_ID_FOR_SRP": "test",
"requiredAttributes": "[\"userAttributes.name\"]",
"userAttributes": "{\"email_verified\":\"true\",\"name\":\"\",\"email\":\"aaa@example.com\"}"
}
}

上記のSessionを使って変更後のパスワードを設定します。

1
2
3
4
5
6
$ aws cognito-idp admin-respond-to-auth-challenge \
--user-pool-id <user_pool_id> \
--client-id <your_client_id> \
--session xxxxxxxxxxxxxxxxxxxxxxxxxx \
--challenge-name NEW_PASSWORD_REQUIRED \
--challenge-responses USERNAME=<username>,NEW_PASSWORD=<password>,userAttributes.user=<user>

結果が返ってきます。こちらの結果は漏らさないように控えます。

1
2
3
4
5
6
7
8
9
10
{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "xxxxxxxxxx",
"ExpiresIn": 3600,
"TokenType": "Bearer",
"RefreshToken": "xxxxxxxxx",
"IdToken": "xxxxxxxxxxx"
}
}

ユーザーがCONFIRMEDになってるのがわかります。

アクセストークンの有効期限について


アクセストークンの有効期限は1時間でこれは現時点では変更できない模様です。切れた場合はリフレッシュトークンを用いて再取得する必要があります。そちらの手順については以前下記の通り記述しました。

AWS CLIでCognitoのアクセストークンをリフレッシュしたい