前回は、現在の実装状況や今後実現するOAuth2 Loginをベースとしたアーキテクチャを、以下のイメージのように整理しました。今回からは、OAuth2 Loginを実現するための認証/認可サーバとなる「Amazon Cognito」について概説し、環境を構築していきます。

構成図

Amazon Cognitoの概要

Amazon Cognitoは、AWSを提供する認証/認可機能を提供するサービスです。主要な機能はユーザーディレクトリ(ユーザー情報データベース)機能を提供する「ユーザープール」と、認証されたユーザーやGoogle、Apple、Facebookなどサードパーティープロバイダーで認証されたユーザーに、AWSサービスへアクセスするための認可を提供する「IDプール」機能に大別されます。

ユーザープールの主要な機能は以下の通りです。

機能 説明
ユーザーデータベース管理 ユーザー属性を定義し、ユーザー情報を管理できます。パスワードポリシーなどを定義したルール化や、電話番号/Emailの認証機能をサポートします
サインアップ/サインイン ユーザーを作成したり、自身にサインアップさせたりすることができます。登録後はHostedUIを用いたサインイン機能をサポートします。サインアップ/サインイン機能については環境構築する上で重要なため、次節で詳細に解説します
多認証要素(Multi Factor Authentication:MFA) EmailやスマートフォンのSMSを使った複数の認証を利用することができます
サードパーティープロバイダー連携 他のソーシャルメディアをはじめとしたサードパーティー認証プロバイダーと連携し、ユーザー情報管理ができます
AWSサービス連携 Amazon API GatewayやLambdaなどのサービスと連携し、認証を行うオーソライザ機能を持っています

また、IDプールでは認証されたユーザーに対して発行されたトークンを検証し、AWSサービスにアクセス可能な一時クレデンシャルを発行できます。

ユーザープールの環境構築

それでは、Amazon Cognitoを使ってユーザープールとIDプールを設定し、加えてOIDCプロバイダーとしてOAuth2 Loginが可能になるようにしていきましょう。手順はコンソールから設定する方法とCloudFormationを使って構築する2種類あります。

本連載では双方紹介しますが、アプリケーションからスタック経由で設定値を参照できる後者の方法を推奨します。ただし、設定内容を説明しやすいため、先にコンソールからの構築手順を解説します。

AWSコンソール上で Amazon Cognitoサービスから、「ユーザープールの管理」→「ユーザープールを作成する」を選択してください。

ユーザープール

表示された画面の左側のメニューに沿って、ユーザープールの定義を行っていきます。「名前」「属性」……と順に設定していきましょう。

設定内容 説明
プール名 ユーザープール名の名称を入力します
ユーザー名 ユーザー名ではサインイン時の識別子(ログインID)に関する設定を行います。ここでは、検証済みの(ユーザーから応答があった)メールを許可する設定を追加します
Eメールアドレスおよび電話番号 Eメールか電話番号自体をユーザー名とするオプションを設定します。本連載では、ユーザー名を「taro.mynavi」などで設定したいので、ここでは設定しません
(推奨)小文字と大文字を区別しない ユーザー名で英大文字と小文字を区別するか選択します。今回は区別する設定を行います
必須の標準属性 ユーザープール(ユーザーディレクトリ)として設定するユーザー属性を定義します。ここでは、「苗字」と「名前」を選択しておきます
カスタム属性 ユーザープール(ユーザーディレクトリ)として設定するカスタムのユーザー属性を定義します。ここでは、「ログインID」と「管理者か否かを表す属性」を作成しておきます
ユーザープール
ユーザープール

続く「ポリシー」では、パスワードのルールをポリシーとして設定します。

設定内容 説明
最小値と使用文字 今回は便宜上、緩い条件を設定していますが、実際はパスワード要件に沿ったものを設定するようにしてください
自己サインアップ ユーザー自身でサインアップを許可するか、管理者のみにユーザー作成を許可するか選択します。今回はユーザーにも自己サインアップを許可する設定を行います
有効期限 ユーザー作成時に有効な一時パスワードの有効期限を設定します。これを過ぎるとユーザーを作り直す必要があります。今回はデフォルトの7日のままで設定しておきます
ユーザープール

次に、多要素認証関連の設定を行います。

設定内容 説明
多認証要素(MFA)設定 サインアップ/サインイン時の認証方法で、Eメールおよび電話番号を使用したSMSを多認証要素として設定します。今回は「なし」に設定します
アカウント回復方法設定 ユーザーがパスワードを忘れた際の、パスワードリセット方法に対する設定を行います。今回は「使用可能な場合はEメール、それ以外の場合は電話。ただし、MFAにも使用している場合、電話でパスワードをリセットすることは許可しません」を設定します
検証時に確認する属性 サインアップ時やパスワードリセット時の確認方法を設定します。今回はEメールを選択します
SMSロール名 SMSを発信するためのロールを作成するためロール名を入力します。今回はデフォルトのままで設定しておきます
ユーザープール

「メッセージのカスタマイズ」では、メールをユーザーに発信する際の設定を行います。

設定内容 説明
Eメールアドレスのカスタマイズ設定 SESリージョンのほか、送信元として表示されるメールやリプライ用のメールなどの設定を行います。発信できるリージョンは「米国東部(バージニア)」などに限られますが、検証時に使われるメール送信の発出元なので、環境構築しているリージョンと異なっていても問題ありません。今回はデフォルトのままで設定します
SESによるメール発信設定 大幅な数のユーザー追加が見込まれるようであれば、より大規模なメール発信が可能なSESによるメール設定を行います。今回はCognitoのままで設定しておきます
Eメール検証メッセージ設定 検証メールの内容をカスタマイズします。今回はデフォルトのままで設定しておきます
ユーザー招待メッセージ設定 招待メールおよび招待メッセージの内容をカスタマイズします。今回はデフォルトのままで設定しておきます
ユーザープール

続く「タグ」では、Cognitoで作成するリソースにタグを付与できますが、今回は何も設定しません。また、「デバイス」ではユーザーデバイスを記憶させておく設定を行えますが、今回は行いません。

「アプリクライアント」では、Cognitoへアクセスするアプリケーションクライアントの設定を行います。本連載では、現状フロントエンドサブネットに配置したWebアプリケーションが相当します。

設定内容 説明
アプリクライアント名 クライアントの名称を設定します
トークンの有効期限を更新 リフレッシュトークンの有効期限の設定を行います。今回はデフォルトの30日に設定します
アクセストークンの有効期限を更新 アクセストークンの有効期限の設定を行います。今回はデフォルトの60分に設定します
IDトークンの有効期限を更新 IDトークンの有効期限の設定を行います。今回はデフォルトの60分に設定します
クライアントシークレットの生成 アクセスしてくるアプリケーションのパスワードに相当するクライアントシークレットを生成します。これは、一般的にサーバサイドでトークンを授受する際に必要なパラメータとなります。 JavaScriptやモバイルアプリケーションなどのユーザー側に渡ってしまう可能性がある環境では、クライアントシークレットを渡さずに実現しますが、ここでWebアプリケーションはサーバサイド側に配置されるのでクライアントシークレットを生成しておきます
認証フローの設定 ここでの認証フローとはOAuth2による認証フローではなく、ユーザーサインアップ時のユーザー認証フローのことを指します。今回は、サーバサイドでCLIやSDKを使ってパスワード認証を有効可能にする「認証用の管理APIのユーザー名パスワード認証を有効にする(ALLOW_ADMIN_USER_PASSWORD_AUTH)」と、「更新トークンベースの認証を有効にする (ALLOW_REFRESH_TOKEN_AUTH)」を選択しておきます
セキュリティ設定(ユーザー存在エラー) ユーザーが存在しない場合の応答エラーを隠蔽したメッセージへとカスタマイズするオプションです。デフォルトのままで設定しておきます

※ なお、「Lambda トリガーベースのカスタム認証を有効にする (ALLOW_CUSTOM_AUTH)」は LambdaでCognitoオーソライザーを行うときに利用します。「ユーザー名パスワードベースの認証を有効にする(ALLOW_USER_PASSWORD_AUTH)」および「SRP (セキュアリモートパスワード) プロトコルベースの認証を有効にする (ALLOW_USER_SRP_AUTH)」はいずれも、JavaScriptやモバイルアプリケーションなどからユーザー名パスワード認証を行うAPIを実行する場合に利用するオプションですが、特別な理由がない限り、セキュアパラメータやソルトを使ってより安全性を高めたSRPプロトコルベースの認証を選択したほうが良いでしょう。 詳細はAmazon Cognitoの開発者ガイド「クライアント側の認証フロー」も参考にしてください

ユーザープール
最後の「トリガー」は、ユーザープールにおけるさまざまなイベント発生時にLambda関数を実行したい場合の設定オプションです。
設定内容 説明
トリガー設定 今回は全てデフォルトのままで設定しておきます
ユーザープール

* * *

今回は、Amazon Cognitoの概要を説明し、ユーザープールの設定方法について説明しました。次回以降は、このユーザープールの構築の中で作成したアプリクライアント定義にOAuth2 Loginとして必要な設定を行った後、IDプールを作成していきます。

著者紹介


川畑 光平(KAWABATA Kohei) - NTTデータ
エグゼクティブ ITスペシャリスト ソフトウェアアーキテクト・デジタルテクノロジーストラテジスト(クラウド)

金融機関システム業務アプリケーション開発・システム基盤担当、ソフトウェア開発自動化関連の研究開発を経て、デジタル技術関連の研究開発・推進に従事。

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなど様々な開発プロジェクト支援にも携わる。AWS Top Engineers & Ambassadors選出。

本連載の内容に対するご意見・ご質問は Facebook まで。