Closed1

Amazon Cognitoに関する雑多なメモ

koheiyamayamakoheiyamayama

Amazon Cognitoにおける認証は

  • initiate-auth
  • respond-to-auth-challenge
    の2つのCLI(≒API)で成立している。

respond-to-auth-challengeでどういうデータを送るかは、initiate-authで指定したauth-flowに基づいて決定する。

AWSドキュメントのこの図がわかりやすい。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/cognito-user-pool-auth-flow-srp.png

さらにCognitoにはいくつかのイベントがあり、イベント発火時にLambda関数を実行することができる。
その一覧はここにある。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html

このイベントをトリガーとして実行するLambdaを上手く使うと、OTPとかが実装できる。
OTPの実装例は以下が分かりやすい。
https://aws.amazon.com/jp/blogs/mobile/implementing-passwordless-email-authentication-with-amazon-cognito/

[TODO]イベントをいい感じに図にしてみる

このOTPの実装に対応するクライアントは↓みたいになる。誰でも分かるように(?)ShellScriptで書いた。
これはsign upに関するスクリプト。安全かとかは気にせずに書いているので、お気をつけを、、、。
また、私が実験で使ったLambdaのコードではメールではなく、SMSでOTPが届くようになっている。

# input phone number
echo "adding country code(jpn is +81) as prefix"
read PHONENUMBER

# sign-up
aws cognito-idp sign-up \
--client-id ${コンソール画面から確認できるID} \
--username $PHONENUMBER \
--password ${任意のパスワード}

# input confirmation code
echo "You can receive confirmation code from Cognito."
echo "Please enter that code."
read CONFIRMATION_CODE

# confirm sign-up
aws cognito-idp confirm-sign-up \
--client-id ${コンソール画面から確認できるID} \
--username $PHONENUMBER \
--confirmation-code $CONFIRMATION_CODE

# start sign-in
RESPONSE=$(aws cognito-idp initiate-auth \
--auth-flow USER_PASSWORD_AUTH \
--client-id ${コンソール画面から確認できるID} \
--auth-parameters USERNAME=$PHONENUMBER,PASSWORD=${任意のパスワード}
)

echo $RESPONSE | jq

↓はsign inのスクリプト。

# input phone number
echo "adding country code(jpn is +81) as prefix"
read PHONENUMBER

# start sign-in
## initiate-auth
RESPONSE=$(aws cognito-idp initiate-auth \
--auth-flow CUSTOM_AUTH \
--client-id ${コンソール画面から確認できるID} \
--auth-parameters USERNAME=$PHONENUMBER | jq -r "{session: .Session, username: .ChallengeParameters.USERNAME}")

SESSION=$(echo $RESPONSE | jq -r ".session")
USERNAME=$(echo $RESPONSE | jq -r ".username")

echo $SESSION
echo $USERNAME

# input confirmation code as one time password
echo "we send one-time password to you. please enter those numbers."
read ONE_TIME_PASSWORD

## respond-to-auth-challenge
aws-vault exec kurashiru-delivery-dev -- \
aws cognito-idp respond-to-auth-challenge \
--challenge-name CUSTOM_CHALLENGE \
--session $SESSION \
--client-id ${コンソール画面から確認できるID}  \
--challenge-responses USERNAME=$USERNAME,ANSWER=$ONE_TIME_PASSWORD

ハマった罠

このスクラップは2022/10/31にクローズされました