4. Cognito ユーザプールクライアントの作成 (handson-cli-cognito-idp-userpool-client)¶
作業の目的 [why]¶
Cognito ユーザプール名"handson-cli-cognito-idp-userpool"にクライアント"handson-cli-cognito-idp-userpool-client"を作成します。
完了条件/事前条件 [設計者用情報]
完了条件 [after]
主処理は、以下を満たしたときに成功したものとします。
- 完了条件1
Cognito ユーザプールクライアント名"handson-cli-cognito-idp-userpool-client"が存在する。
事前条件 [before]
主処理の実施は、以下の状態であることを前提とします。
- 事前条件1
Cognito ユーザプール名"handson-cli-cognito-idp-userpool"が存在する。
- 事前条件2
Cognito ユーザプールクライアント名"handson-cli-cognito-idp-userpool-client"が存在しない。
- 事前条件3
Callback URL"https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/callback.html"がアクセス可能である。
- 事前条件4
Logout URL"https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/logout.html"がアクセス可能である。
作業対象 [what]¶
Cognito Idpユーザプール
標準時間(合計)¶
8分
パラメータ設定¶
- パラメータ設定の標準時間
2分
作業に必要なモノ・情報 [resource]¶
作業開始には、以下が全て揃っていることが必要です。
リソース1: Cognitoユーザプール名
Cognitoユーザプールクライアントを作成するCognito ユーザプールの名称です。
今回は"handson-cli-cognito-idp-userpool"とします。
リソース2: Cognitoユーザプールクライアント名
作成するCognitoユーザプールクライアントの名称です。
今回は"handson-cli-cognito-idp-userpool-client"とします。
リソース3: Cognitoユーザプールクライアントで有効なIDプロバイダ名
作成するCognitoユーザプールクライアントで有効なIDプロバイダの名称です。
今回は"COGNITO"とします。
リソース4: Cognitoユーザプールクライアント明示的認証フロー
作成するCognitoユーザプールクライアントの明示的な認証フローです。
今回は"ALLOW_CUSTOM_AUTH ALLOW_REFRESH_TOKEN_AUTH ALLOW_USER_SRP_AUTH"とします。
リソース5: Cognitoユーザプールクライアントユーザ存在エラー防止方法
作成するCognitoユーザプールクライアントのユーザ存在エラー防止方法です。
今回は"LEGACY"とします。
リソース6: CognitoユーザプールクライアントCallbackページURL
作成するCognitoユーザプールクライアントのCallbackページURLです。
今回は"https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/callback.html"とします。
リソース7: CognitoユーザプールクライアントLogoutページURL
作成するCognitoユーザプールクライアントのLogoutページURLです。
今回は"https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/logout.html"とします。
リソース8: CognitoユーザプールクライアントのOAuthフロー
作成するCognitoユーザプールクライアントののOAuthフローです。
今回は"implicit"とします。
リソース9: CognitoユーザプールクライアントのOAuthスコープ
作成するCognitoユーザプールクライアントのOAuthスコープです。
今回は"email openid"とします。
パラメータの指定¶
作業に必要なパラメータを変数に格納をします。
0.1. Cognitoユーザプール名の指定¶
Cognitoユーザプール名を指定します。
変数の設定:
COGNITO_IDP_USER_POOL_NAME='handson-cli-cognito-idp-userpool'
0.2. Cognitoユーザプールクライアント名の指定¶
Cognitoユーザプールクライアント名を指定します。
変数の設定:
COGNITO_IDP_USER_POOL_CLIENT_NAME='handson-cli-cognito-idp-userpool-client'
0.3. Cognitoユーザプールで有効なIDプロバイダ名の指定¶
Cognitoユーザプールクライアントで有効なIDプロバイダ名を指定します。
変数の設定:
COGNITO_IDP_USER_POOL_CLIENT_SUPPORTED_IDENTITY_PROVIDERS='COGNITO'
0.4. Cognitoユーザプールクライアント明示的認証フローの指定¶
Cognitoユーザプールクライアントの明示的認証フローを指定します。
変数の設定:
COGNITO_IDP_USER_POOL_CLIENT_EXPLICIT_AUTH_FLOWS='ALLOW_CUSTOM_AUTH ALLOW_REFRESH_TOKEN_AUTH ALLOW_USER_SRP_AUTH'
0.5. Cognitoユーザプールクライアントユーザ存在エラー防止方法の指定¶
Cognitoユーザプールクライアントのユーザ存在エラー防止方法を指定します。
変数の設定:
COGNITO_IDP_USER_POOL_CLIENT_PREVENT_USER_EXISTENCE_ERROR='LEGACY'
0.6. CognitoユーザプールクライアントのCallback URLの指定¶
CognitoユーザプールクライアントのCallback URLを指定します。
変数の設定:
S3_BUCKET_PREFIX_CALLBACK='handson-cli-cognito-idp-landing'
コマンド:
AWS_ID=$( \ aws sts get-caller-identity \ --query 'Account' \ --output text \ ) \ && echo ${AWS_ID}
結果(例):
XXXXXXXXXXXX
変数の設定:
S3_BUCKET_NAME_CALLBACK="${S3_BUCKET_PREFIX_CALLBACK}-${AWS_ID}" \ && echo ${S3_BUCKET_NAME_CALLBACK}
結果(例):
handson-cli-cognito-idp-landing-XXXXXXXXXXXX
変数の設定:
S3_BUCKET_LOCATION_CALLBACK=$( \ aws s3api get-bucket-location \ --bucket ${S3_BUCKET_NAME_CALLBACK} \ --output text \ ) \ && echo ${S3_BUCKET_LOCATION_CALLBACK}
結果(例):
ap-northeast-1
変数の設定:
URL_S3_BUCKET_ENDPOINT_CALLBACK="https://s3.${S3_BUCKET_LOCATION_CALLBACK}.amazonaws.com/${S3_BUCKET_NAME_CALLBACK}" \ && echo ${URL_S3_BUCKET_ENDPOINT_CALLBACK}
結果(例):
変数の設定:
NAME_CALLBACK_PAGE='callback.html'
変数の設定:
COGNITO_IDP_USER_POOL_CLIENT_CALLBACK_URL="${URL_S3_BUCKET_ENDPOINT_CALLBACK}/${NAME_CALLBACK_PAGE}" \ && echo ${COGNITO_IDP_USER_POOL_CLIENT_CALLBACK_URL}
結果(例):
https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/callback.html
0.7. CognitoユーザプールクライアントのLogout URLの指定¶
CognitoユーザプールクライアントのCallback URLを指定します。
変数の設定:
S3_BUCKET_PREFIX_LOGOUT='handson-cli-cognito-idp-landing'
コマンド:
AWS_ID=$( \ aws sts get-caller-identity \ --query 'Account' \ --output text \ ) \ && echo ${AWS_ID}
結果(例):
XXXXXXXXXXXX
変数の設定:
S3_BUCKET_NAME_LOGOUT="${S3_BUCKET_PREFIX_LOGOUT}-${AWS_ID}" \ && echo ${S3_BUCKET_NAME_LOGOUT}
結果(例):
handson-cli-cognito-idp-landing-XXXXXXXXXXXX
変数の設定:
S3_BUCKET_LOCATION_LOGOUT=$( \ aws s3api get-bucket-location \ --bucket ${S3_BUCKET_NAME_LOGOUT} \ --output text \ ) \ && echo ${S3_BUCKET_LOCATION_LOGOUT}
結果(例):
ap-northeast-1
変数の設定:
URL_S3_BUCKET_ENDPOINT_LOGOUT="https://s3.${S3_BUCKET_LOCATION_LOGOUT}.amazonaws.com/${S3_BUCKET_NAME_LOGOUT}" \ && echo ${URL_S3_BUCKET_ENDPOINT_LOGOUT}
結果(例):
変数の設定:
NAME_LOGOUT_PAGE='logout.html'
変数の設定:
COGNITO_IDP_USER_POOL_CLIENT_LOGOUT_URL="${URL_S3_BUCKET_ENDPOINT_LOGOUT}/${NAME_LOGOUT_PAGE}" \ && echo ${COGNITO_IDP_USER_POOL_CLIENT_LOGOUT_URL}
結果(例):
https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/logout.html
0.8. CognitoユーザプールクライアントのOAuthフローの指定¶
CognitoユーザプールクライアントのOAuthフローを指定します。
変数の設定:
COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_FLOWS='implicit'
0.9. CognitoユーザプールクライアントのOAuthスコープの指定¶
CognitoユーザプールクライアントのOAuthスコープを指定します。
変数の設定:
COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_SCOPES='email openid'
パラメータの保存¶
設定されている変数の保存先となるファイル名を指定します。
変数の設定:
DIR_PARAMETER="${HOME}/tmp/parameter-handson-cli-cognito-idp" FILE_PARAMETER="${DIR_PARAMETER}/$(date +%Y-%m-%d)-cognito_idp-user_pool_client-create-expand-user_pool_domain.env" \ && echo ${FILE_PARAMETER}
結果(例):
${HOME}/tmp/parameter-handson-cli-cognito-idp/2019-12-11-cognito_idp-user_pool_client-create-expand-user_pool_domain.env
各変数に正しいパラメータ値が格納されていることを確認しながら保存します。
変数の確認:
cat << EOF > ${FILE_PARAMETER} # 0.0. AWS_DEFAULT_REGION:"ap-northeast-1" AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}" # 0.1. COGNITO_IDP_USER_POOL_NAME:"handson-cli-cognito-idp-userpool" COGNITO_IDP_USER_POOL_NAME="${COGNITO_IDP_USER_POOL_NAME}" # 0.2. COGNITO_IDP_USER_POOL_CLIENT_NAME:"handson-cli-cognito-idp-userpool-client" COGNITO_IDP_USER_POOL_CLIENT_NAME="${COGNITO_IDP_USER_POOL_CLIENT_NAME}" # 0.3. COGNITO_IDP_USER_POOL_CLIENT_SUPPORTED_IDENTITY_PROVIDERS:"COGNITO" COGNITO_IDP_USER_POOL_CLIENT_SUPPORTED_IDENTITY_PROVIDERS="${COGNITO_IDP_USER_POOL_CLIENT_SUPPORTED_IDENTITY_PROVIDERS}" # 0.4. COGNITO_IDP_USER_POOL_CLIENT_EXPLICIT_AUTH_FLOWS:"ALLOW_CUSTOM_AUTH ALLOW_REFRESH_TOKEN_AUTH ALLOW_USER_SRP_AUTH" COGNITO_IDP_USER_POOL_CLIENT_EXPLICIT_AUTH_FLOWS="${COGNITO_IDP_USER_POOL_CLIENT_EXPLICIT_AUTH_FLOWS}" # 0.5. COGNITO_IDP_USER_POOL_CLIENT_PREVENT_USER_EXISTENCE_ERROR:"LEGACY" COGNITO_IDP_USER_POOL_CLIENT_PREVENT_USER_EXISTENCE_ERROR="${COGNITO_IDP_USER_POOL_CLIENT_PREVENT_USER_EXISTENCE_ERROR}" # 0.6. COGNITO_IDP_USER_POOL_CLIENT_CALLBACK_URL:"https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/callback.html" COGNITO_IDP_USER_POOL_CLIENT_CALLBACK_URL="${COGNITO_IDP_USER_POOL_CLIENT_CALLBACK_URL}" # 0.7. COGNITO_IDP_USER_POOL_CLIENT_LOGOUT_URL:"https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/logout.html" COGNITO_IDP_USER_POOL_CLIENT_LOGOUT_URL="${COGNITO_IDP_USER_POOL_CLIENT_LOGOUT_URL}" # 0.8. COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_FLOWS:"implicit" COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_FLOWS="${COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_FLOWS}" # 0.9. COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_SCOPES:"email openid" COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_SCOPES="${COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_SCOPES}" EOF cat ${FILE_PARAMETER}
下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号に戻って変数の設定を行います。
タスクの実施¶
- タスク標準時間
6分
1. 前処理¶
処理対象の状態確認¶
主処理の実施は、以下の状態であることを前提とします。
前提と異なることが判明した場合、直ちに処理を中止します。
事前条件1: Cognito ユーザプール名"handson-cli-cognito-idp-userpool"が存在する。
「Cognito ユーザプール名"handson-cli-cognito-idp-userpool"が存在する。」ことを確認します。
コマンド:
aws cognito-idp list-user-pools \ --max-results 60 \ --query "UserPools[?Name == \`${COGNITO_IDP_USER_POOL_NAME}\`].Name" \ --output text
結果(例):
handson-cli-cognito-idp-userpool
コマンド:
COGNITO_IDP_USER_POOL_ID=$( \ aws cognito-idp list-user-pools \ --max-results 60 \ --query "UserPools[?Name == \`${COGNITO_IDP_USER_POOL_NAME}\`].Id" \ --output text \ ) \ && echo ${COGNITO_IDP_USER_POOL_ID}
結果(例):
ap-northeast-1_xxxxxxxxx
事前条件2: Cognito ユーザプールクライアント名"handson-cli-cognito-idp-userpool-client"が存在しない。
「Cognito ユーザプールクライアント名"handson-cli-cognito-idp-userpool-client"が存在しない。」ことを確認します。
コマンド:
aws cognito-idp list-user-pool-clients \ --user-pool-id ${COGNITO_IDP_USER_POOL_ID} \ --query "UserPoolClients[?ClientName == \`${COGNITO_IDP_USER_POOL_CLIENT_NAME}\`].ClientName" \ --output text
結果(例):
(出力なし)
事前条件3: Callback URL"https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/callback.html"がアクセス可能である。
「Callback URL"https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/callback.html"がアクセス可能である。」ことを確認します。
コマンド:
curl -LI -Ss \ -o /dev/null \ -w '%{http_code}\n' \ ${COGNITO_IDP_USER_POOL_CLIENT_CALLBACK_URL}
結果(例):
200
事前条件4: Logout URL"https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/logout.html"がアクセス可能である。
「Logout URL"https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/logout.html"がアクセス可能である。」ことを確認します。
コマンド:
curl -LI -Ss \ -o /dev/null \ -w '%{http_code}\n' \ ${COGNITO_IDP_USER_POOL_CLIENT_LOGOUT_URL}
結果(例):
200
2. 主処理¶
Cognito ユーザプールクライアントの作成¶
変数の確認:
cat << ETX # COGNITO_IDP_USER_POOL_ID:"ap-northeast-1_xxxxxxxxx" COGNITO_IDP_USER_POOL_ID="${COGNITO_IDP_USER_POOL_ID}" # COGNITO_IDP_USER_POOL_CLIENT_NAME:"handson-cli-cognito-idp-userpool-client" COGNITO_IDP_USER_POOL_CLIENT_NAME="${COGNITO_IDP_USER_POOL_CLIENT_NAME}" # COGNITO_IDP_USER_POOL_CLIENT_SUPPORTED_IDENTITY_PROVIDERS:"COGNITO" COGNITO_IDP_USER_POOL_CLIENT_SUPPORTED_IDENTITY_PROVIDERS="${COGNITO_IDP_USER_POOL_CLIENT_SUPPORTED_IDENTITY_PROVIDERS}" # COGNITO_IDP_USER_POOL_CLIENT_EXPLICIT_AUTH_FLOWS:"ALLOW_CUSTOM_AUTH ALLOW_REFRESH_TOKEN_AUTH ALLOW_USER_SRP_AUTH" COGNITO_IDP_USER_POOL_CLIENT_EXPLICIT_AUTH_FLOWS="${COGNITO_IDP_USER_POOL_CLIENT_EXPLICIT_AUTH_FLOWS}" # COGNITO_IDP_USER_POOL_CLIENT_CALLBACK_URL:"https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/callback.html" COGNITO_IDP_USER_POOL_CLIENT_CALLBACK_URL="${COGNITO_IDP_USER_POOL_CLIENT_CALLBACK_URL}" # COGNITO_IDP_USER_POOL_CLIENT_LOGOUT_URL:"https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/logout.html" COGNITO_IDP_USER_POOL_CLIENT_LOGOUT_URL="${COGNITO_IDP_USER_POOL_CLIENT_LOGOUT_URL}" # COGNITO_IDP_USER_POOL_CLIENT_PREVENT_USER_EXISTENCE_ERROR:"LEGACY" COGNITO_IDP_USER_POOL_CLIENT_PREVENT_USER_EXISTENCE_ERROR="${COGNITO_IDP_USER_POOL_CLIENT_PREVENT_USER_EXISTENCE_ERROR}" # COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_FLOWS:"implicit" COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_FLOWS="${COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_FLOWS}" # COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_SCOPES:"email openid" COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_SCOPES="${COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_SCOPES}" ETX
コマンド:
aws cognito-idp create-user-pool-client \ --user-pool-id ${COGNITO_IDP_USER_POOL_ID} \ --client-name ${COGNITO_IDP_USER_POOL_CLIENT_NAME} \ --supported-identity-providers ${COGNITO_IDP_USER_POOL_CLIENT_SUPPORTED_IDENTITY_PROVIDERS} \ --explicit-auth-flows ${COGNITO_IDP_USER_POOL_CLIENT_EXPLICIT_AUTH_FLOWS} \ --callback-urls $(echo '["'$COGNITO_IDP_USER_POOL_CLIENT_CALLBACK_URL'"]') \ --logout-urls $(echo '["'$COGNITO_IDP_USER_POOL_CLIENT_LOGOUT_URL'"]') \ --prevent-user-existence-errors ${COGNITO_IDP_USER_POOL_CLIENT_PREVENT_USER_EXISTENCE_ERROR} \ --allowed-o-auth-flows-user-pool-client \ --allowed-o-auth-flows ${COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_FLOWS} \ --allowed-o-auth-scopes ${COGNITO_IDP_USER_POOL_CLIENT_ALLOWD_O_AUTH_SCOPES} \ --no-generate-secret
結果(例):
{ "UserPoolClient": { "UserPoolId": "ap-northeast-1_xxxxxxxxx", "ClientName": "handson-cli-cognito-idp-userpool-client", "ClientId": "xxxxxxxxxxxxxxxxxxxxxxxxxx", "LastModifiedDate": 1234567890.000, "CreationDate": 1234567890.000, "RefreshTokenValidity": 30, "ExplicitAuthFlows": [ "ALLOW_CUSTOM_AUTH", "ALLOW_USER_SRP_AUTH", "ALLOW_REFRESH_TOKEN_AUTH" ], "SupportedIdentityProviders": [ "COGNITO" ], "CallbackURLs": [ "https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/callback.html" ], "LogoutURLs": [ "https://s3.ap-northeast-1.amazonaws.com/handson-cli-cognito-idp-landing-XXXXXXXXXXXX/logout.html" ], "AllowedOAuthFlows": [ "implicit" ], "AllowedOAuthScopes": [ "openid", "email" ], "AllowedOAuthFlowsUserPoolClient": true, "PreventUserExistenceErrors": "LEGACY" } }
注釈
バグ( https://github.com/aws/aws-cli/issues/2894 )対応のため、'["https://example.com"]'形式でechoしています。
3. 後処理¶
完了条件の確認¶
主処理は、以下を満たしたときに成功したものとします。
完了条件1: Cognito ユーザプールクライアント名"handson-cli-cognito-idp-userpool-client"が存在する。
「Cognito ユーザプールクライアント名"handson-cli-cognito-idp-userpool-client"が存在する。」ことを確認します。
コマンド:
aws cognito-idp list-user-pool-clients \ --user-pool-id ${COGNITO_IDP_USER_POOL_ID} \ --query "UserPoolClients[?ClientName == \`${COGNITO_IDP_USER_POOL_CLIENT_NAME}\`].ClientName" \ --output text
結果(例):
handson-cli-cognito-idp-userpool-client