Amazon Cognitoは、ウェブおよびモバイルアプリケーションのユーザー認証、認可、ユーザー管理を提供するAWSのサービスです。Cognitoを使用することで、開発者はユーザーのサインアップ、サインイン、アクセス制御を簡単に追加でき、ユーザーIDを安全に管理できます。また、ソーシャルIDプロバイダー(Facebook、Google、Appleなど)やエンタープライズIDプロバイダー(SAML、OpenID Connectなど)との統合も可能です。
Amazon Cognitoは、主に以下の2つのコンポーネントで構成されています:
ユーザープールは、ウェブおよびモバイルアプリケーションのユーザーディレクトリです。ユーザープールを使用することで、ユーザーはユーザー名とパスワード、またはソーシャルIDプロバイダーを通じてアプリケーションにサインインできます。ユーザープールは、ユーザー登録、サインイン、アカウント回復、ユーザープロファイル管理などの機能を提供します。
IDプール(フェデレーテッドアイデンティティ)は、ユーザーに一時的なAWS認証情報を提供し、AWSリソースへのアクセスを許可します。IDプールを使用することで、ユーザーはCognitoユーザープール、ソーシャルIDプロバイダー、またはカスタム認証プロセスを通じて認証し、AWSサービス(S3、DynamoDB、API Gatewayなど)に直接アクセスできます。
Amazon Cognitoは、以下のような認証フローをサポートしています:
ユーザー アプリケーション Cognito | | | |--- 登録情報 ------------->| | | |--- ユーザー登録 --------->| | | |--- 確認コード送信 --- |<-- 確認コード要求 ---------|<-- 登録成功 -------------| | | | |--- 確認コード入力 -------->| | | |--- アカウント確認 -------->| | |<-- 確認成功 -------------| |<-- 確認完了 --------------| | | | | |--- サインイン情報 -------->| | | |--- 認証リクエスト -------->| | |<-- トークン発行 ----------| |<-- サインイン成功 ---------| | | | |
ユーザー アプリケーション Cognito AWS サービス | | | | |--- サインイン情報 -------->| | | | |--- 認証リクエスト -------->| | | |<-- IDトークン発行 ---------| | |<-- サインイン成功 ---------| | | | | | | |--- リソースアクセス要求 --->| | | | |--- IDトークン交換 -------->| | | |<-- AWS認証情報 ------------| | | | | | | |--- AWS認証情報でアクセス ----------------------->| | |<-- リソースレスポンス ---------------------------| |<-- リソースレスポンス ------| | |
Amazon Cognitoは、AWS Management Console、AWS CLI、SDKs、またはAPIを使用して利用できます。
aws cognito-idp create-user-pool \
--pool-name MyUserPool \
--policies '{"PasswordPolicy":{"MinimumLength":8,"RequireUppercase":true,"RequireLowercase":true,"RequireNumbers":true,"RequireSymbols":true}}' \
--auto-verified-attributes email \
--schema '[{"Name":"email","Required":true},{"Name":"name","Required":true}]' \
--mfa-configuration OFF
aws cognito-idp create-user-pool-client \
--user-pool-id us-west-2_abcdefghi \
--client-name MyAppClient \
--no-generate-secret \
--explicit-auth-flows ALLOW_USER_PASSWORD_AUTH ALLOW_REFRESH_TOKEN_AUTH \
--supported-identity-providers COGNITO \
--callback-urls '["https://example.com/callback"]' \
--logout-urls '["https://example.com/logout"]' \
--allowed-o-auth-flows code implicit \
--allowed-o-auth-scopes openid email profile \
--allowed-o-auth-flows-user-pool-client
aws cognito-identity create-identity-pool \
--identity-pool-name MyIdentityPool \
--allow-unauthenticated-identities \
--cognito-identity-providers ProviderName=cognito-idp.us-west-2.amazonaws.com/us-west-2_abcdefghi,ClientId=1example23456789,ServerSideTokenCheck=false
aws cognito-identity set-identity-pool-roles \
--identity-pool-id us-west-2:12345678-1234-1234-1234-123456789012 \
--roles authenticated=arn:aws:iam::123456789012:role/Cognito_MyIdentityPoolAuth_Role,unauthenticated=arn:aws:iam::123456789012:role/Cognito_MyIdentityPoolUnauth_Role
aws cognito-idp admin-create-user \
--user-pool-id us-west-2_abcdefghi \
--username johndoe \
--user-attributes Name=email,Value=johndoe@example.com Name=name,Value="John Doe" \
--message-action SUPPRESS
aws cognito-idp admin-confirm-sign-up \
--user-pool-id us-west-2_abcdefghi \
--username johndoe
aws cognito-idp list-users \
--user-pool-id us-west-2_abcdefghi
aws cognito-idp admin-initiate-auth \
--user-pool-id us-west-2_abcdefghi \
--client-id 1example23456789 \
--auth-flow ADMIN_USER_PASSWORD_AUTH \
--auth-parameters USERNAME=johndoe,PASSWORD=P@ssw0rd
aws cognito-idp admin-initiate-auth \
--user-pool-id us-west-2_abcdefghi \
--client-id 1example23456789 \
--auth-flow REFRESH_TOKEN_AUTH \
--auth-parameters REFRESH_TOKEN=your-refresh-token
amplify add auth
? Do you want to use the default authentication and security configuration?
Default configuration
? How do you want users to be able to sign in?
Username
? Do you want to configure advanced settings?
No, I am done.
import { Amplify, Auth } from 'aws-amplify';
import awsconfig from './aws-exports';
Amplify.configure(awsconfig);
// サインアップ
async function signUp() {
try {
const { user } = await Auth.signUp({
username: 'johndoe',
password: 'P@ssw0rd',
attributes: {
email: 'johndoe@example.com',
name: 'John Doe'
}
});
console.log('サインアップ成功:', user);
} catch (error) {
console.log('サインアップエラー:', error);
}
}
// 確認
async function confirmSignUp() {
try {
await Auth.confirmSignUp('johndoe', '123456');
console.log('確認成功');
} catch (error) {
console.log('確認エラー:', error);
}
}
// サインイン
async function signIn() {
try {
const user = await Auth.signIn('johndoe', 'P@ssw0rd');
console.log('サインイン成功:', user);
} catch (error) {
console.log('サインインエラー:', error);
}
}
// 現在のユーザーの取得
async function getCurrentUser() {
try {
const user = await Auth.currentAuthenticatedUser();
console.log('現在のユーザー:', user);
} catch (error) {
console.log('ユーザー取得エラー:', error);
}
}
// サインアウト
async function signOut() {
try {
await Auth.signOut();
console.log('サインアウト成功');
} catch (error) {
console.log('サインアウトエラー:', error);
}
}
Amazon Cognitoは、アプリケーションのユーザー認証と認可を安全に管理するための多くのセキュリティ機能を提供しています:
Cognitoは、SMS、TOTPベースのアプリケーション(Google Authenticator、Microsoft Authenticatorなど)を使用した多要素認証をサポートしています。MFAを有効にすると、ユーザーはサインイン時にパスワードに加えて2つ目の認証要素を提供する必要があります。
aws cognito-idp set-user-pool-mfa-config \
--user-pool-id us-west-2_abcdefghi \
--software-token-mfa-configuration Enabled=true \
--mfa-configuration ON
適応型認証は、リスクベースの認証メカニズムで、ユーザーのサインインパターン、デバイス、場所などの要素に基づいて追加の認証チャレンジを要求します。これにより、不審なサインイン試行を検出し、アカウントの乗っ取りを防止できます。
aws cognito-idp update-user-pool-client \
--user-pool-id us-west-2_abcdefghi \
--client-id 1example23456789 \
--prevent-user-existence-errors ENABLED \
--enable-token-revocation \
--auth-session-validity 3 \
--user-pool-add-ons AdvancedSecurityMode=ENFORCED
Cognitoは、データ侵害で漏洩した認証情報のデータベースと照合して、ユーザーのパスワードをチェックできます。コンプロマイズされた認証情報が検出された場合、ユーザーにパスワードの変更を要求できます。
Cognitoでは、パスワードの最小長、大文字・小文字・数字・特殊文字の要件、パスワードの有効期限などのパスワードポリシーを設定できます。
aws cognito-idp update-user-pool \
--user-pool-id us-west-2_abcdefghi \
--policies '{"PasswordPolicy":{"MinimumLength":12,"RequireUppercase":true,"RequireLowercase":true,"RequireNumbers":true,"RequireSymbols":true,"TemporaryPasswordValidityDays":7}}'
Cognitoは、連続した認証失敗に対してアカウントロックアウトポリシーを設定できます。これにより、ブルートフォース攻撃からアカウントを保護できます。
Cognitoは、JWT(JSON Web Token)を使用してユーザーの認証と認可を管理します。トークンは署名され、有効期限が設定されており、改ざんを検出できます。
Amazon Cognitoは以下のようなユースケースに適しています:
モバイルアプリケーションでは、Cognitoを使用してユーザーのサインアップ、サインイン、ソーシャルIDプロバイダーとの統合を実装できます。また、IDプールを使用して、認証されたユーザーにAWSリソース(S3バケット、DynamoDBテーブルなど)への直接アクセスを許可できます。
SPAでは、Cognitoを使用してユーザー認証を実装し、JWTを使用してAPIへのアクセスを制御できます。Cognitoのホスト型UIを使用して、カスタマイズ可能なサインインおよびサインアップページを提供することもできます。
マイクロサービスアーキテクチャでは、Cognitoを使用して一元的なユーザー認証を提供し、JWTを使用してサービス間の認証と認可を実装できます。これにより、各マイクロサービスが独自の認証メカニズムを実装する必要がなくなります。
Amazon Cognitoは他のAWSサービスと統合して、より強力な認証と認可のソリューションを構築できます:
サービス | 統合の利点 |
---|---|
Amazon API Gateway | Cognitoユーザープールを使用してAPIへのアクセスを制御 |
AWS AppSync | GraphQL APIへのアクセスをCognitoで認証 |
AWS Lambda | 認証フローのカスタマイズ、ユーザー管理の自動化 |
Amazon S3 | IDプールを使用してS3バケットへの直接アクセスを許可 |
Amazon DynamoDB | IDプールを使用してDynamoDBテーブルへの直接アクセスを許可 |
AWS Amplify | フロントエンドアプリケーションとの簡単な統合 |
Amazon Pinpoint | ユーザーエンゲージメントとアナリティクス |
AWS WAF | ウェブアプリケーションファイアウォールによる保護 |
Amazon CloudWatch | 認証イベントのモニタリングとアラート |
Amazon Cognitoは、ウェブおよびモバイルアプリケーションのユーザー認証、認可、ユーザー管理を提供するAWSのサービスです。ユーザープールとIDプールの2つの主要なコンポーネントを通じて、安全で拡張性の高いユーザー認証と認可のソリューションを構築できます。
Amazon Cognitoの主な利点は以下の通りです:
Amazon Cognitoを効果的に活用するには、多要素認証の有効化、適応型認証の使用、強力なパスワードポリシーの設定、最小権限の原則の適用などのベストプラクティスを実践することが重要です。また、AWS Amplify、API Gateway、AppSyncなどの他のAWSサービスと統合することで、より強力な認証と認可のソリューションを構築できます。