27
18

More than 5 years have passed since last update.

AWS CognitoをPythonから扱う

Last updated at Posted at 2019-01-24

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叩ける。

追記(2019/1/26)

Cognitoのupdate_atの型

  • Cognitoの型がStringしか使えない?
    update_atに値を入れるときに型変換しないとboto3からエラーが帰ってくる
    最終的な宣言方法は以下
    str(int(time.time()))

今後

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

27
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
18