AWS CognitoをPythonから扱う

AWS CognitoをPythonから扱う:


AWS CognitoをPythonから呼び出そうとしたら盛大にハマった

  • と言うことでAWS CognitoをBoto3経由で呼び出す時の備忘録として残しておく


事前準備


Cognitoへのアクセスを許可したIAMを作成しておく


AWS CognitoでUserPoolを作成する

  • とりあえず適当に進めていく
    スクリーンショット.png

    スクリーンショット 1.png

    スクリーンショット 3.png

    スクリーンショット 2.png

    スクリーンショット 4.png

  • このアプリクライアントを作成するときに以下の2点を変更。(ハマりパート1)

    • クライアントシークレットを作成のチェックを外す

      • シークレットがあるとパスワードで承認出来ないらしい…?
    • USER_PASSWORD_AUTHにチェック
      スクリーンショット 5.png


Python設定


バージョン

  • Python : 3.6.0
  • botocore : 1.12.83


ユーザ作成

import boto3 
 
 
def cognito_auth(username, email, gender, birthday, nickname): 
    # 認証開始 
    try: 
        aws_client = boto3.client('cognito-idp', 
            region_name = 'ap-northeast-1', 
            aws_access_key_id = '***', 
            aws_secret_access_key = '***', 
        ) 
 
        # ユーザー作成 
        aws_result = aws_client.admin_create_user( 
            # cognito設定時のユーザープールID 
            UserPoolId='***', 
            Username=username, 
            UserAttributes=[ 
                { 
                    'Name': 'email', 
                    'Value': email 
                }, 
                { 
                    'Name': 'gender', 
                    'Value': gender 
                }, 
                { 
                    'Name': 'birthdate', 
                    'Value': birthdate 
                }, 
                { 
                    'Name': 'nickname', 
                    'Value': nickname 
                }, 
            ], 
            # Mailに初期パスワードを送信する 
            DesiredDeliveryMediums=['EMAIL'] 
        ) 
 
        # 認証完了 
        print(aws_result) 
 
    except: 
        # 認証失敗 
        print('Error') 
 
 
cognito_auth('username', 'email', 'gender', 'birthdate', 'nickname') 


承認要求

response = aws_client.initiate_auth( 
    # PASSWORDによる承認 
    AuthFlow='USER_PASSWORD_AUTH', 
    AuthParameters={ 
        'USERNAME': '***', 
        'PASSWORD': '***' 
    }, 
    ClientId='***' 
) 
 
 
print(response) 


承認要求への返答

  • 上のプログラムを実行後に帰ってくるChallengeName, Sessionを利用して以下を実行する

    • 今回はChallengeName='NEW_PASSWORD_REQUIRED'
response = aws_client.respond_to_auth_challenge( 
    ClientId='***', 
    ChallengeName='ChallengeName', 
    Session='***', 
    ChallengeResponses={ 
        'NEW_PASSWORD': 'NEW_PASSWORD', 
        'USERNAME': 'USERNAME' 
    } 
) 
 
print(response) 
 
  • ここまで実行するとACCESS_TOKENがAWSから吐き出される。
  • このACCESS_TOKENを使って色々API叩ける。


今後


新しいAPIを使うときには追加していく。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)