Amazon Cognito UserPoolによる認証機能をAWS CLIでサクッと作成する

2022.03.11

こんにちは、CX事業本部 IoT事業部の若槻です。

Amazon Cognitoによる認証を行いたい場合にはAmazon Cognito UserPoolを使用することになりますが、一時的な検証用途などで使用したい場合にAmazon Cognito UserPoolの認証機能をAWS CLIでサクッと作成する手順を確認してみましたので共有します。

やってみた

Amazon Cognito UserPoolの使用では、基本的に次の3つのリソースを合わせて作成することになります。それぞれAWS CLIで作成してみます。

  • UserPool
  • UserPool Domain
  • UserPool Client

また前提として、Webアプリ(SPA)などからOAuth2.0認証により使用できる設定とします。

UserPool作成

UserPoolの作成はcreate-user-poolコマンドで行います。

下記のようにコマンドを実行し、UserPoolを作成します。

$ USER_POOL_NAME=test-pool
$ ALLOW_ADMINC_CREATE_USER_ONLY_FLAG=<true | false>

$ aws cognito-idp create-user-pool \
  --pool-name ${USER_POOL_NAME} \
  --alias-attributes "email" \
  --schema \
    Name=email,Required=true \
    Name=hogeAttr,AttributeDataType=String,Mutable=true \
  --admin-create-user-config AllowAdminCreateUserOnly=${ALLOW_ADMINC_CREATE_USER_ONLY_FLAG}

オプション補足

  • --alias-attributes:ユーザーがサインインに使用できるエイリアス属性を指定します。phone_numberemailpreferred_usernameのいずれか1つ以上を指定します。
  • --schema:ユーザースキーマに関する指定を行います。
    • Name=email,Required=trueによりエイリアス属性に指定したemailの登録を必須としています。
    • (必要な場合)Name=hogeAttr,AttributeDataType=String,Mutable=trueではカスタムスキーマを設けています。Mutable=trueとすれば値が変更可能となります。
  • --admin-create-user-configAllowAdminCreateUserOnly=trueとすることによりユーザーによるサインアップを無効にします。既定ではfalseとなります。

UserPool Domain作成

UserPool Domainの作成はcreate-user-pool-domainコマンドで行います。UserPool DomainはHosted UIおよびOAuth 2.0のエンドポイントとして使われます。

下記のようにコマンドを実行し、UserPool Domainを作成します。

$ USER_POOL_ID=<前節で作成したUserPoolのID>
$ COGNITO_DOMAIN_NAME=<適当なドメイン名>

$ aws cognito-idp create-user-pool-domain \
  --user-pool-id ${USER_POOL_ID} \
  --domain ${COGNITO_DOMAIN_NAME}

オプション補足

  • --user-pool-id:UserPool Domainを設定するUserPoolのIDを指定します。
  • --domain:右記のエンドポイントURLの<DOMAIN>の部分を指定します。https://<DOMAIN>.auth.ap-northeast-1.amazoncognito.com/。もしくはカスタムドメインも指定可能です。(その場合はFQDNを指定)

UserPool Client作成

UserPool Clientの作成はcreate-user-pool-clientコマンドで行います。ユーザーは、認証やユーザー情報の要求をUserPoolに対して直接行うのではなく、このUserPool Clientを通じて行います。

下記のようにコマンドを実行し、UserPool Clientを作成します。

$ USER_POOL_CLIENT_NAME=<適当なクライアント名>

$ aws cognito-idp create-user-pool-client \
  --user-pool-id ${USER_POOL_ID} \
  --client-name ${USER_POOL_CLIENT_NAME} \
  --no-generate-secret \
  --supported-identity-providers "COGNITO" \
  --callback-urls "http://localhost:3000" "https://example.com" \
  --logout-urls "http://localhost:3000" "https://example.com" \
  --allowed-o-auth-flows "code" \
  --allowed-o-auth-scopes "phone" "email" "openid" "profile" "aws.cognito.signin.user.admin" \
  --allowed-o-auth-flows-user-pool-client

オプション補足

  • --no-generate-secret:Webアプリで使用する場合はこれを指定しないと認証時にエラーとなる場合があります。
  • supported-identity-providers:ClientがサポートするIDプロバイダを指定します。COGNITOFacebookGoogleおよびLoginWithAmazonのいずれか1つ以上を指定します。
  • --callback-urls:サインイン後のリダイレクト先として許可するURLです。
  • --logout-urls:ログアウト後のリダイレクト先として許可するURLです。
  • allowed-o-auth-flows:OAuth grant typeとしてcodeimplicitまたはclient_credentialsのいずれかを指定します。Webアプリでの利用ではcodeを指定します。これにより認可コードが提供されるOAuth 2.0に則ったフローを利用できます。
  • --allowed-o-auth-scopes:clientがアクセストークンに含めるために取得できる属性を指定します。phoneまたはemailを指定する場合はopenidの指定も必須です。またカスタム属性も指定できます。aws.cognito.signin.user.adminを指定するとAmazon Cognito user pool API operationsへのアクセスを与えられます。
  • --allowed-o-auth-flows-user-pool-client:OAuthプロトコルを使用する場合は指定します。

ユーザー作成

ここまででAmazon Cognito UserPoolによる認証で必要なリソースを作成できました。ここでついでなのでユーザーもAWS CLIのadmin-create-userコマンドで作成してしまいましょう。

下記のようにコマンドを実行し、ユーザーを作成します。

$ USER_NAME=wakatsuki-test
$ MAIL=user@example.com
$ HOGE_ATTR=fugafuga

$ aws cognito-idp admin-create-user \
  --user-pool-id ${USER_POOL_ID} \
  --username ${USER_NAME} \
  --user-attributes \
    Name=email,Value=${MAIL} \
    Name=email_verified,Value=True \
    Name=custom:hogeAttr,Value=${HOGE_ATTR}

するとメールアドレス宛に一時パスワードが届きます。

動作確認

作成したCognito UserPoolとユーザーで認証の動作確認をHosted UIで行ってみます。

Hosted UIの画面はUserPool Clientのダッシュボードから開けますが、URLを手動作成することも可能です。

$ COGNITO_DOMAIN_NAME=<UserPool Domain作成時に指定したドメイン>
$ CLIENT_ID=<前節で作成したUserPool ClientのID>
$ REDIRECT_URL=http%3A%2F%2Flocalhost%3A3000 //前節でUserPool Clientに設定したコールバックURLのURLエンコード
$ REGION=ap-northeast-1

$ echo "https://${COGNITO_DOMAIN_NAME}.auth.${REGION}.amazoncognito.com/login?response_type=code&client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URL}"

作成したURLにアクセスするとHosted UIにアクセスできました。ユーザー名とパスワードを指定してサインイン。

新しいパスワードを指定して送信。

すでにlocalhost:3000として起動してあったwebアプリにアクセスできました。

後始末

検証が終わったら後始末をしましょう。作成時とは逆順にコマンドで削除を行っていきます。

$ aws cognito-idp delete-user-pool-client --user-pool-id ${USER_POOL_ID} --client-id ${CLIENT_ID}
$ aws cognito-idp delete-user-pool-domain --user-pool-id ${USER_POOL_ID} --domain ${COGNITO_DOMAIN_NAME}
$ aws cognito-idp delete-user-pool --user-pool-id ${USER_POOL_ID}

参考

以上