Amazon Cognitoのユーザープール(認証機能提供サービス)機能の概要についてまとめる。
概念
ユーザープール
- 独自のユーザーディレクトリ、アプリへのアクセスに利用できるトークンを提供する機能
ユーザー
-
作成方法:ユーザー自身 or 管理者
- 外部 IDプロバイダーのユーザは、初回サインイン時に情報が自動的に登録される。
-
属性情報
- Cognito固有情報:ユーザー名、ステータス、ロール、...
- 標準属性(OIDC準拠):メールアドレス、電話番号、...
- カスタム属性:上記で定義されていない独自情報
- サインインに用いたデバイス情報:デバイスキー、名前、IP、...
-
サインイン
- 利用可能な情報
* ユーザープール作成時に、設定※作成後の変更不可。
* ユーザー名、メールアドレス、電話番号...+パスワード+MFA系情報
- 利用可能な情報
-
グループ
- ユーザーの管理単位
- 1ユーザーは複数のグループに所属可能
- IAMロールの割り当てや優先順位の指定可能
アプリクライアント
-
Cognitoに登録したユーザープールにアクセスするアプリケーション。
-
利用可能な機能や権限の設定が可能。
-
IAMクレデンシャル不要
-
Cognitoはアプリケーション向けに払い出したクライアントID、シークレットで識別を行う。
-
設定項目※利用するAPIによって異なる。
- 全般設定:ID、シークレット、認証フロー
- アプリ統合:連携外部IDプロバイダー、コールバックURI(リダイレクトURI)、サインアウトURL、許可するOAuthフロー
サインイン実装
Cognito Identity Provider API利用
- サインイン/アップ、ログイン、パスワード変更/再設定、ユーザー属性変更などを行うことができるAPI。
- ユーザープール独自のユーザーを利用する場合に推奨。
- 外部 Id プロバイダーにサインインするための認可エンドポイントへのリンクをUIに配置する。
- ユーザ名・パスワードの入力フォームをUIに用意する。
- Admin API
- 管理者としてサーバーから呼び出す。
- API認証情報として、IAMロールクレデンシャルを利用する。サインイン時はアプリクライアントID必要。
- 非Admin API
- ユーザーとして、サーバーおよびクライアントから呼び出す。
- API認証情報として、クライアントID(+シークレット)を利用。サインイン後は、ユーザー向けに払い出したトークンを利用する。
- サインインに利用する認証フロー
-
USER_SRP_AUTH
:SRPプロトコルに基づいた方法。パスワードを基にしたチャレンジレスポンスで認証する。サーバー側でも元のパスワードは不明な状態になるなど安全なフロー。 -
CUSTOM_AUTH
:認証時に Lambda ファンクションがトリガーされ、ファンクション次第で追加の認証を行って認証する。 -
USER_PASSWORD_ AUTH
:SRPプロトコルを使用せず、パスワード自体を送って認証する。クライアントからはUSER_SRP_AUTH
の利用を推奨。 -
ADMIN_USER_PASSWORD_AUTH
:USER_PASSWORD_AUTH
と類似したフロー。違いはサーバー用 API からのみ呼び出せる点。 -
REFRESH_TOKEN_AUTH
:リフレッシュトークンから新しいトークンを取得する。
-
Cognito Auth API と Hosted UI 利用
- Cognito がマネージドサービスの一部として、サインアップ、サインイン、パスワード忘れの対応を行うことができる
Web UI
を提供する。 - ユーザープール独自のユーザーを利用しない場合は、こちらを推奨。
- 外部 Id プロバイダーにサインインするための認可エンドポイントへのリンクのみを配置したUI を用意する。
- 多要素認証(MFA)に対応。
- ドメイン名、UI のロゴ、CSS のカスタマ イズが可能
- 日本語対応は不可
- 対応するOAuthフロー
- Authorization Code Grant ※こちらのほうがセキュアなため推奨
- Implicit Grant
サインイン後実装
トークン
-
IDトークン
- 有効期限:1時間
- 用途
- Cognito IDプールにアクセス
- アプリAPIにアクセス
-
アクセストークン
- 有効期限:1時間
- 用途
- アプリAPIにアクセス
- Identity Provider API にユーザとしてアクセス
-
リフレッシュトークン
- 有効期限:1~3650日
- 用途:IDトークン・アクセストークンを更新
※各トークンはJWT形式(OAuth,OIDCと同様)
サインアウト実装方法
- トークンをアプリ or SDKでクライアントから破棄。
- Identity Provide API(ユーザーとして呼び出し)のグローバルサインアウト利用。
- Auth APIでログアウトエンドポイントで無効化。