この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、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_number
、email
、preferred_username
のいずれか1つ以上を指定します。--schema
:ユーザースキーマに関する指定を行います。Name=email,Required=true
によりエイリアス属性に指定したemail
の登録を必須としています。- (必要な場合)
Name=hogeAttr,AttributeDataType=String,Mutable=true
ではカスタムスキーマを設けています。Mutable=true
とすれば値が変更可能となります。
--admin-create-user-config
:AllowAdminCreateUserOnly=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プロバイダを指定します。COGNITO
、Facebook
、Google
およびLoginWithAmazon
のいずれか1つ以上を指定します。--callback-urls
:サインイン後のリダイレクト先として許可するURLです。--logout-urls
:ログアウト後のリダイレクト先として許可するURLです。allowed-o-auth-flows
:OAuth grant typeとしてcode
、implicit
または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}
参考
以上