Amazon Cognito UserPoolによる認証機能をAWS CLIでサクッと作成する
こんにちは、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 $ [email protected] $ 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}
参考
以上