CognitoのユーザーでAWS Management Consoleにログインしてみる

CognitoユーザープールのユーザーでAWSのマネジメントコンソールへログインする方法を紹介いたします。 先日、Cognito IDプールからAWSの一時クレデンシャルキーを発行する方法について解説したブログを書きました。 そのブログの応用編です。
2020.05.07

今回のブログでは、CognitoユーザープールのユーザーAWSのマネジメントコンソールへログインする方法を紹介いたします。

先日、Cognito IDプールからAWSの一時クレデンシャルキーを発行する方法について解説したブログを書きました。 このブログの応用編です。

この方法を用いることで、Cognitoユーザープールのログイン情報(IDトークン)から、AWSの一時クレデンシャルキーが発行できました。

ということは、IAMで一時クレデンシャルキーを発行すればできることが、Cognitoユーザープールでも条件がそろえばだいたいできるわけです。

たとえば、AWSの一時クレデンシャルキーを利用することで、マネジメントコンソールへのログインが可能です。詳しい内容は弊社ブログを御覧ください。

よって、この2つを組み合わせることでCognitoユーザープールのユーザーからAWSのマネジメントコンソールへログインすることが可能です。

それでは実際にCognitoユーザーでAWSのマネジメントコンソールへのログインをやってみましょう。

CognitoユーザープールのユーザーからAWSの一時クレデンシャルキーを発行する

CognitoユーザープールのユーザーからAWSの一時クレデンシャルキーを発行する環境の構築については、以前書いたブログをご参照ください。 このとき構築したCognitoユーザープールとCogntio IDプールを流用します。

次のようにコマンドを実行して、AWSの一時クレデンシャルキーを取得できていることを前提とします。

$ REGION=us-west-2
$ USER_POOL_ID=us-west-2_xxxxxxxxx
$ CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxx
$ USER_EMAIL=email@example.com
$ PASSWORD="Password01@"
$ IDENTITY_POOL_ID=us-west-2:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
$ COGNITO_USER_POOL=cognito-idp.${REGION}.amazonaws.com/${USER_POOL_ID}
$ ID_TOKEN=$(aws cognito-idp admin-initiate-auth \
  --user-pool-id ${USER_POOL_ID} \
  --client-id ${CLIENT_ID} \
  --auth-flow ADMIN_NO_SRP_AUTH \
  --auth-parameters "USERNAME=${USER_EMAIL},PASSWORD=${PASSWORD}" \
  --query "AuthenticationResult.IdToken" \
  --output text) && echo ${ID_TOKEN}
$ IDENTITY_ID=$(aws cognito-identity get-id \
  --identity-pool-id ${IDENTITY_POOL_ID} \
  --logins "${COGNITO_USER_POOL}=${ID_TOKEN}" \
  --query "IdentityId" \
  --output text) && echo ${IDENTITY_ID}
$ OUTPUT=$(aws cognito-identity get-credentials-for-identity \
  --identity-id ${IDENTITY_ID} \
  --logins "${COGNITO_USER_POOL}=${ID_TOKEN}") && echo ${OUTPUT}

合わせて、取得した一時クレデンシャルキーを jq コマンドを使って、次のように環境変数に格納されていることを前提として話を進めます。

$ AWS_ACCESS_KEY_ID=$(echo ${OUTPUT} | jq .Credentials.AccessKeyId)
$ AWS_SECRET_ACCESS_KEY=$(echo ${OUTPUT} | jq .Credentials.SecretKey)
$ AWS_SESSION_TOKEN=$(echo ${OUTPUT} | jq .Credentials.SessionToken)

AWSの一時クレデンシャルキーからAWSログイン用URLの生成

あらためてCognitoのログインからAWSのマネジメントコンソールにフェデレーションログインするまでのフローを確認してみるとこんな感じです。

前章でフローの1〜11.一時クレデンシャルキーの提供まで完了している想定です。

ここからは一時クレデンシャルキーを利用して、AWSのフェデレーションエンドポイントからサインイントークンの取得と、サインイントークンを利用してフェデレーションログインのためのURLを生成します。

AWSのマネジメントコンソールに対するフェデレーションログインの方法についての詳細は、公式ドキュメントをご参照ください。

まずは、次のコマンドを実行してサインイントークンを取得します。 (※URLエンコードをするために nkf, sed, tr コマンド、URLへのアクセスに curl コマンドを使用しています。)

$ SIGNIN_URL="https://signin.aws.amazon.com/federation"
$ JSON_FORMED_SESSION=$(echo "{\"sessionId\":${AWS_ACCESS_KEY_ID},\"sessionKey\":${AWS_SECRET_ACCESS_KEY},\"sessionToken\":${AWS_SESSION_TOKEN}}")
$ ENCODED_JSON_FORMED_SESSION=$(echo ${JSON_FORMED_SESSION}|nkf -WwMQ|sed 's/=$//g'|tr = %|tr -d '\n')
$ GET_SIGNIN_TOKEN_URL="${SIGNIN_URL}?Action=getSigninToken&SessionType=json&Session=${ENCODED_JSON_FORMED_SESSION}"
$ SIGNIN_TOKEN_JSON=$(curl -s "${GET_SIGNIN_TOKEN_URL}") && echo ${SIGNIN_TOKEN_JSON}

まず2行目で一時クレデンシャルキーをJSON文字列にしています。

3行目で2行目に生成したJSON文字列をコマンド(nkf -WwMQ|sed 's/=$//g'|tr = %|tr -d '\n' )を利用してURLエンコードしています。

4行目でサインイントークンを取得するためのURLを生成しています。

5行目で curl コマンドでAWS Federation Endpointにアクセスしてサインイントークンを取得しています。

このコマンドを実行してサインイントークンを取得すると、こんな形で結果が返ってきます。

サインイントークンが取得できたので、これを利用して次のコマンドを実行してAWSのマネジメントコンソールにフェデレーションログインするためのURLを生成します。

$ SIGNIN_URL="https://signin.aws.amazon.com/federation"
$ SIGNIN_TOKEN=$(echo ${SIGNIN_TOKEN_JSON}|jq ".SigninToken" | tr -d "\"")
$ ISSUER_URL="https://example.com/"
$ ENCODED_ISSUER_URL=$(echo ${ISSUER_URL}|nkf -WwMQ|sed 's/=$//g'|tr = %|tr -d '\n')
$ CONSOLE_URL="https://console.aws.amazon.com/"
$ ENCODED_CONSOLE_URL=$(echo ${CONSOLE_URL}|nkf -WwMQ|sed 's/=$//g'|tr = %|tr -d '\n')
$ LOGIN_URL="${SIGNIN_URL}?Action=login&Issuer=${ENCODED_ISSUER_URL}&Destination=${ENCODED_CONSOLE_URL}&SigninToken=${SIGNIN_TOKEN}" && echo ${LOGIN_URL}

2行目で jq コマンドを利用して、サインイントークンの値だけ抽出しています。

7行目で全部組み合わせて、フェデレーションログインするためのURLを生成しています。 このコマンドを実行してURLを生成すると、こういったとても長いURLが生成されます。

このURLをブラウザにコピー&ペーストしてアクセスすると、CognitoユーザーのIAM Roleの権限AWSのマネジメントコンソールへフェデレーションログインが可能です。

終わりに

Cognitoユーザープールを使ったマネジメントコンソールへのログインをやってみました。

Cognito IDプールの世界をIAMの世界に引っ張ってくることで、IAMでできることがCognitoでも同じようにいろいろできるよという一例の紹介です。

本ブログでは説明のためにログインやIDトークンの取り回しをAWS CLIで行いましたが、AWS Amplifyのライブラリを使えばいい感じにやってくれるので、実際にCognitoを利用する際にはぜひこちらを活用してください。