AWS CognitoをAWS CLIで操作してみた

#AWS
#Cognito
#AWS CLI

lambdaでAPI経由でCognitoを操作する処理を実装したい。 実際の動作を検証のため、AWS CLIを叩いてみた。

 

以下のフローで叩いていく

  1. ユーザー作成
  2. ログイン処理
  3. 新しいパスワードを設定
  4. 再度ログイン処理
  5. メールアドレス認証コード要求
  6. メールアドレス認証コード送信

CognitoのセットアップはCDKで一括で構築しました

 

CDKの設定は以下記事を参照してください

AWS CLI Cognitoの公式ドキュメントは以下

=> https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/index.html

 

以下は usernameに適当なULID, attributesに birthdate, email, preferred_username, universal_idを設定、 各適当な値を代入してください(emailは各自有効なものを使用) 強制的にemail_verifiedをtrueに出来るが 後でメール認証を別で行うため、email_verifiedの値をfalseにしておく user-pool-idはAWSコンソールから確認してください

 

イメージ図1

 

イメージ図2

 

$ 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" } }

ここではログイン処理のコマンドを叩くが、 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\"}" } }

 

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": "--------" } }

 

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": "--------" } }

 

まだメール認証はしていないので、email_verifiedはfalseになっています。 イメージ図3

 

リクエストすることで指定したメールアドレスに認証コードが届く。

$ 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" } }

 

送られてきた認証コードを--codeに渡してリクエストするとemailが認証済みとなる

$ aws cognito-idp verify-user-attribute \ --attribute-name email \ --profile hogehoge \ --code <送られてきた認証コードを貼り付ける> \ --access-token "-----< 4でメモしたAccessTokenを貼り付ける >-----"

 

以下のようにemail_verifiedはtrueになりました。 イメージ図3