AWS Cognitoについて整理したことをメモしておきます。
IDフェデレーション
認証プロバイダ(Google, Facebook, Twitterなど)から発行されたIDをCognito内のレコードとして結びつけ管理する機能。
また、認証されたユーザのCognito レコードに対して、一時的なIAMロールを発行できます。
仮にクライアントから直接AWS各リソースにアクセスする場合、セキュリティ的にNGのACCESS_KEYとSECRETを公開するしかなかく、セキュリティを担保する為にはリソースアクセス用のアプリケーション等が必要であったが、IDフェデレーションを利用することによって、クライアントへ認証時に渡されるCognito IDを通して各リソースへアクセス可能となります。
例えば、ロールをDynamoDBのResource、table
とユーザに応じた特定のitem
のみアクセス可能などの定義をし、ユーザに発行することができる。
Cognito IDを一時的なIAMユーザのACCESS_KEYとして扱うようなイメージ。なのかな。もし仮にユーザが悪用しようとしても、そのユーザに許可したリソースしかアクセスできないことになる。
認証プロバイダを使用したAWSリソースアクセスロール取得までの流れ
- ブラウザ(またはクライアント)から認証プロバイダにアクセス、プロバイダ用のアクセストークンを取得。
- ブラウザは取得したアクセストークンをCognitoに送信。Cognitoは受信したアクセストークンを登録済みの認証プロバイダに対して検証を行い、ブラウザに対してCognito IDを返却する。
- ブラウザは受け取ったCognito IDを通して、ロールで許可されたAWSリソースにアクセス可能となる。
また、認証プロバイダのトークン有効期限が切れると、Cognito IDの認証も期限切れとなる。
ID(アイデンティティ)プール
CognitoIDを管理するプール。所謂、Usersテーブルとかそういったもの。に近いものだと思う。
IDプールに対してのIAMロール付与のポリシー
IAMロールを付与することを可能とするIAMロールをCognito IDプールに与える必要があります。
下記はIDプールに付与するカスタムロールの例。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-1:your-identity-pool-id" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }
DynamoDBへのアクセスカスタムロール定義する
CognitoIDに対してのDynamoDBアクセスロールの例。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "dynamodb:BatchGetItem", "dynamodb:BatchWriteItem", "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:UpdateItem" ], "Resource": ["your dynamodb table arn"], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"]} } }] }
以下でCoginitIDに対応したitemのアクセス許可を可能にしています。
"Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"] } }
ユーザプール
サードパーティの認証プロバイダではなく、アプリケーション独自での認証機能を用いる場合のID/PASSWROD等の認証情報プール。所謂、user_accounts?テーブル。みないなものだと思う。
また、サードパーティも含めたCognito認証のサインアップ、サインイン機能を提供する。
アプリケーション管理者はユーザに対するパスワードを意識して管理する必要がなく、パスワードのハッシュ化や認証のロジック実装に関して開放されることになります。
認証されたユーザプールの情報はIDプールのCognitoIDと紐づくことになる。はず。