はじめに
何かとサーバレス構成の認証でよく利用するCognitoで、MFAを有効化したCognitoユーザープールよりCLIでToken取得をしてみました。
目次
手順の概要
基本的には下記の認証フロー通りに実施するだけです。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html
一番上の図を参照
- ClientからInitiate Authの実行
- 返却されたSession情報を受信
- MFAコードを受信 (今回はSMSを設定)
- AuthChallengeへ応答
- MFAコードの送信
- 目的のToken受信
手順
Cognito アプリクライントの設定
アプリベースの認証でユーザー名とパスワードの (SRP を使用しない) フローを有効にする (USER_PASSWORD_AUTH)
ClientからInitiate Authの実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ aws cognito-idp initiate-auth \ > --auth-flow USER_PASSWORD_AUTH \ > --client-id ***Cognito設定にて確認できるアプリクライントID \ > --auth-parameters \ > USERNAME=[Cognito上に作成したユーザID],PASSWORD=[Cognito上に作成したユーザPW] 下記レスポンス { "ChallengeName": "SMS_MFA", "Session": "[次のリクエストで利用するためのSession情報]", "ChallengeParameters": { "CODE_DELIVERY_DELIVERY_MEDIUM": "SMS", "CODE_DELIVERY_DESTINATION": "+***MFA通知先電話番号", "USER_ID_FOR_SRP": "***ユーザ名が表示される" } } |
※Profileを利用している場合、パラメータに --profile *** として指定
AuthChallengeへ応答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ aws cognito-idp respond-to-auth-challenge \ > --client-id ***Cognito設定にて確認できるアプリクライントID \ > --challenge-name SMS_MFA \ > --challenge-responses \ > USERNAME=[Cognito上に作成したユーザID],SMS_MFA_CODE=[SMSに通知されたCode]] \ > --session "[上記レスポンスでSessionとして返却された内容を入れ込む]" 下記レスポンス { "ChallengeParameters": {}, "AuthenticationResult": { "AccessToken": "***アクセストークンが表示される", "ExpiresIn": 3600, "TokenType": "Bearer", "RefreshToken": "***リフレッシュトークンが表示される", "IdToken": "***Idトークンが表示される", "NewDeviceMetadata": { "DeviceKey": "ap-northeast-1_***", "DeviceGroupKey": "***" } } } |
※Profileを利用している場合、パラメータに --profile *** として指定
結果確認
https://jwt.io 等でTokenがDecode出来る事を確認できました。