Closed1
Amazon Cognitoに関する雑多なメモ
Amazon Cognitoにおける認証は
- initiate-auth
- respond-to-auth-challenge
の2つのCLI(≒API)で成立している。
respond-to-auth-challengeでどういうデータを送るかは、initiate-authで指定したauth-flowに基づいて決定する。
AWSドキュメントのこの図がわかりやすい。
さらにCognitoにはいくつかのイベントがあり、イベント発火時にLambda関数を実行することができる。
その一覧はここにある。
このイベントをトリガーとして実行するLambdaを上手く使うと、OTPとかが実装できる。
OTPの実装例は以下が分かりやすい。
[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
ハマった罠
-
https://www.notion.so/Research-As-a-user-I-d-like-to-sign-up-without-entering-a-password-6be440e1ba6d4013817a2ab4287d9b15
- Cognitoに関連するLambda Functionが5秒以内に応答しない場合、再度イベントが発火する、つまりもう一度Functionが実行される。これによってOTPの送信が何回も来るという罠にハマった。
- 記事内で紹介されているJSのコードは修正しないと動かない。
このスクラップは2022/10/31にクローズされました