AWS CognitoをAWS CLIで操作してみた
やりたいこと
lambdaでAPI経由でCognitoを操作する処理を実装したい。 実際の動作を検証のため、AWS CLIを叩いてみた。
以下のフローで叩いていく
- ユーザー作成
- ログイン処理
- 新しいパスワードを設定
- 再度ログイン処理
- メールアドレス認証コード要求
- メールアドレス認証コード送信
準備
CognitoのセットアップはCDKで一括で構築しました
CDKの設定は以下記事を参照してください
参考
AWS CLI Cognitoの公式ドキュメントは以下
=> https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/index.html
1. ユーザー作成
以下は usernameに適当なULID, attributesに birthdate, email, preferred_username, universal_idを設定、 各適当な値を代入してください(emailは各自有効なものを使用) 強制的にemail_verifiedをtrueに出来るが 後でメール認証を別で行うため、email_verifiedの値をfalseにしておく user-pool-idはAWSコンソールから確認してください
$ aws cognito-idp admin-create-user \ --user-pool-id ap-northeast-1_XcUrrRp8V \ --username 4476225e-7ad6-401c-9f19-050974880776 \ --user-attributes \ Name=birthdate,Value=1981-01-01 \ Name=email,Value=hogehoge@hugahuga.co.jp \ Name=preferred_username,Value=1001-002 \ Name=custom:universal_id,Value=4476225e-7ad6-401c-9f19-050974880776 \ Name=email_verified,Value=false --temporary-password Abcd1234# \ --profile hugahuga
レスポンス(*一部編集しています)
{ "User": { "Username": "4476225e-7ad6-401c-9f19-050974880776", "Attributes": [ { "Name": "sub", "Value": "b914ca0a-ccbe-4483-af65-c01f05d3bfb6" }, { "Name": "birthdate", "Value": "1981-01-01" }, { "Name": "email_verified", "Value": "false" }, { "Name": "custom:universal_id", "Value": "4476225e-7ad6-401c-9f19-050974880776" }, { "Name": "preferred_username", "Value": "1001-002" }, { "Name": "email", "Value": "hogehoge@hugahuga.co.jp" } ], "UserCreateDate": 1649427181.445, "UserLastModifiedDate": 1649427181.445, "Enabled": true, "UserStatus": "FORCE_CHANGE_PASSWORD" } }
2. ログイン処理
ここではログイン処理のコマンドを叩くが、 UserStatusがFORCE_CHANGE_PASSWORDのため 新しいパスワードが必要というSessionつきのレスポンスが返ってくる client-idはAWS コンソールでアプリクライアントIDから取得します。
$ aws cognito-idp admin-initiate-auth \ --user-pool-id ap-northeast-1_hogehoge \ --client-id pf5avtmqfbv2lejh8hugahuga \ --auth-flow ADMIN_NO_SRP_AUTH \ --auth-parameters \ USERNAME=1001-002,PASSWORD=Abcd1234# \ --profile hugahuga
レスポンス
{ "ChallengeName": "NEW_PASSWORD_REQUIRED", "Session": "-----< 後で使うため、メモに取る >-----", "ChallengeParameters": { "USER_ID_FOR_SRP": "4476225e-7ad6-401c-9f19-050974880776", "requiredAttributes": "[]", "userAttributes": "{\"email_verified\":\"false\",\"birthdate\":\"1981-01-01\",\"custom:universal_id\":\"4476225e-7ad6-401c-9f19-050974880776\",\"preferred_username\":\"1001-002\",\"email\":\"hogehoge@hugahuga.co.jp\"}" } }
3.パスワード登録
2のレスポンスで得たsessionを引数に使います。
$ aws cognito-idp admin-respond-to-auth-challenge \ --user-pool-id ap-northeast-1_hogehoge \ --client-id pf5avtmqfbv2lejh8hugahuga \ --challenge-name NEW_PASSWORD_REQUIRED \ --challenge-response NEW_PASSWORD=Abcd4321#,USERNAME=1001-002,email=hogehoge@hugahuga.co.jp \ --profile hugahuga \ --session "------< 2でメモしたSessionを使用する >------"
{ "ChallengeParameters": {}, "AuthenticationResult": { "AccessToken": "--------", "ExpiresIn": 3600, "TokenType": "Bearer", "RefreshToken": "--------", "IdToken": "--------" } }
4.再度ログイン処理
AccessTokenが返ってくるのでメモしておく。
$ aws cognito-idp admin-initiate-auth \ --user-pool-id ap-northeast-1_hogehoge \ --client-id pf5avtmqfbv2lejh8hugahuga \ --auth-flow ADMIN_NO_SRP_AUTH \ --auth-parameters \ USERNAME=1001-002,PASSWORD=Abcd4321# \ --profile hugahuga
response
{ "ChallengeParameters": {}, "AuthenticationResult": { "AccessToken": "----< 後に使用するのでメモに取る >----", "ExpiresIn": 3600, "TokenType": "Bearer", "RefreshToken": "--------", "IdToken": "--------" } }
5.メールアドレス認証コード送信
まだメール認証はしていないので、email_verifiedはfalseになっています。
リクエストすることで指定したメールアドレスに認証コードが届く。
$ aws cognito-idp get-user-attribute-verification-code \ --attribute-name email \ --profile hugahuga \ --access-token "----< 4でメモしたAccessTokenを貼り付ける >-----"
response
{ "CodeDeliveryDetails": { "Destination": "h***@h***", "DeliveryMedium": "EMAIL", "AttributeName": "email" } }
6.認証コード入力
送られてきた認証コードを--codeに渡してリクエストするとemailが認証済みとなる
$ aws cognito-idp verify-user-attribute \ --attribute-name email \ --profile hogehoge \ --code <送られてきた認証コードを貼り付ける> \ --access-token "-----< 4でメモしたAccessTokenを貼り付ける >-----"
以下のようにemail_verifiedはtrueになりました。