cognito について
Web・モバイルアプリで AWS Cognito による認証、認可、ユーザー管理を設定する開発者向けのリファレンスです。ユーザープール、アイデンティティプール、トークン、CLI 操作、トラブルシューティングを扱います。
主な機能
- 01ユーザープールの登録と認証
- 02フェデレーション ID と一時認証情報
- 03OAuth 2.0、OIDC、トークン管理
- 04AWS CLI の主なコマンド
- 05セキュリティ指針とトラブルシューティング
活用シーン
- 01アプリのユーザー登録とログイン設定
- 02ユーザーの MFA とパスワードポリシー設定
- 03AWS リソースアクセス用の認証情報取得
- 04ログインやトークン検証の問題調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ itsmostafa/ aws-agent-skills --skill cognitoインストール後、Claude Code で/cognitoを入力して読み込まれたか確認します。
同梱ファイルauth-flows.md
詳細
AWS Cognito
Amazon Cognito は、ウェブアプリケーションやモバイルアプリケーション向けに認証、認可、ユーザー管理を提供します。ユーザーは直接、またはフェデレーション ID プロバイダーを通じてサインインできます。
目次
主な概念
ユーザープール
サインアップとサインイン用のユーザーディレクトリです。以下を提供します。
- ユーザー登録と認証
- OAuth 2.0 / OpenID Connect トークン
- MFA とパスワードポリシー
- カスタマイズ可能な UI とフロー
ID プール(フェデレーション ID)
AWS サービスにアクセスするための一時的な AWS 認証情報を提供します。ユーザーには次の種類があります。
- Cognito ユーザープールのユーザー
- ソーシャル ID(Google、Facebook、Apple)
- SAML/OIDC のエンタープライズ ID
- 匿名ゲスト
トークン
| トークン | 用途 | 有効期間 |
|---|---|---|
| ID トークン | ユーザー ID のクレーム | 1 時間 |
| アクセストークン | API 認可 | 1 時間 |
| リフレッシュトークン | 新しい ID トークン/アクセストークンの取得 | 30 日(設定可能) |
一般的なパターン
ユーザープールの作成
AWS CLI:
aws cognito-idp create-user-pool \
--pool-name my-app-users \
--policies '{
"PasswordPolicy": {
"MinimumLength": 12,
"RequireUppercase": true,
"RequireLowercase": true,
"RequireNumbers": true,
"RequireSymbols": true
}
}' \
--auto-verified-attributes email \
--username-attributes email \
--mfa-configuration OPTIONAL \
--user-attribute-update-settings '{
"AttributesRequireVerificationBeforeUpdate": ["email"]
}'
アプリクライアントの作成
aws cognito-idp create-user-pool-client \
--user-pool-id us-east-1_abc123 \
--client-name my-web-app \
--generate-secret \
--explicit-auth-flows ALLOW_USER_SRP_AUTH ALLOW_REFRESH_TOKEN_AUTH \
--supported-identity-providers COGNITO \
--callback-urls https://myapp.com/callback \
--logout-urls https://myapp.com/logout \
--allowed-o-auth-flows code \
--allowed-o-auth-scopes openid email profile \
--allowed-o-auth-flows-user-pool-client \
--access-token-validity 60 \
--id-token-validity 60 \
--refresh-token-validity 30 \
--token-validity-units '{
"AccessToken": "minutes",
"IdToken": "minutes",
"RefreshToken": "days"
}'
ユーザーのサインアップ
import boto3
import hmac
import hashlib
import base64
cognito = boto3.client('cognito-idp')
def get_secret_hash(username, client_id, client_secret):
message = username + client_id
dig = hmac.new(
client_secret.encode('utf-8'),
message.encode('utf-8'),
digestmod=hashlib.sha256
).digest()
return base64.b64encode(dig).decode()
response = cognito.sign_up(
ClientId='client-id',
SecretHash=get_secret_hash('[email protected]', 'client-id', 'client-secret'),
Username='[email protected]',
Password='SecurePassword123!',
UserAttributes=[
{'Name': 'email', 'Value': '[email protected]'},
{'Name': 'name', 'Value': 'John Doe'}
]
)
サインアップの確認
cognito.confirm_sign_up(
ClientId='client-id',
SecretHash=get_secret_hash('[email protected]', 'client-id', 'client-secret'),
Username='[email protected]',
ConfirmationCode='123456'
)
ユーザーの認証
response = cognito.initiate_auth(
ClientId='client-id',
AuthFlow='USER_SRP_AUTH',
AuthParameters={
'USERNAME': '[email protected]',
'SECRET_HASH': get_secret_hash('[email protected]', 'client-id', 'client-secret'),
'SRP_A': srp_a # From SRP library
}
)
# For simple password auth (not recommended for production)
response = cognito.admin_initiate_auth(
UserPoolId='us-east-1_abc123',
ClientId='client-id',
AuthFlow='ADMIN_USER_PASSWORD_AUTH',
AuthParameters={
'USERNAME': '[email protected]',
'PASSWORD': 'password',
'SECRET_HASH': get_secret_hash('[email protected]', 'client-id', 'client-secret')
}
)
tokens = response['AuthenticationResult']
id_token = tokens['IdToken']
access_token = tokens['AccessToken']
refresh_token = tokens['RefreshToken']
トークンの更新
response = cognito.initiate_auth(
ClientId='client-id',
AuthFlow='REFRESH_TOKEN_AUTH',
AuthParameters={
'REFRESH_TOKEN': refresh_token,
'SECRET_HASH': get_secret_hash('[email protected]', 'client-id', 'client-secret')
}
)
ID プールの作成
aws cognito-identity create-identity-pool \
--identity-pool-name my-app-identities \
--allow-unauthenticated-identities \
--cognito-identity-providers \
ProviderName=cognito-idp.us-east-1.amazonaws.com/us-east-1_abc123,\
ClientId=client-id,\
ServerSideTokenCheck=true
AWS 認証情報の取得
import boto3
cognito_identity = boto3.client('cognito-identity')
# Get identity ID
response = cognito_identity.get_id(
IdentityPoolId='us-east-1:12345678-1234-1234-1234-123456789012',
Logins={
'cognito-idp.us-east-1.amazonaws.com/us-east-1_abc123': id_token
}
)
identity_id = response['IdentityId']
# Get credentials
response = cognito_identity.get_credentials_for_identity(
IdentityId=identity_id,
Logins={
'cognito-idp.us-east-1.amazonaws.com/us-east-1_abc123': id_token
}
)
credentials = response['Credentials']
# Use credentials['AccessKeyId'], credentials['SecretKey'], credentials['SessionToken']
CLI リファレンス
ユーザープール
| コマンド | 説明 |
|---|---|
aws cognito-idp create-user-pool | ユーザープールを作成 |
aws cognito-idp describe-user-pool | プールの詳細を取得 |
aws cognito-idp update-user-pool | プールの設定を更新 |
aws cognito-idp delete-user-pool | プールを削除 |
aws cognito-idp list-user-pools | プールを一覧表示 |
ユーザー
| コマンド | 説明 |
|---|---|
aws cognito-idp admin-create-user | ユーザーを作成(管理者) |
aws cognito-idp admin-delete-user | ユーザーを削除 |
aws cognito-idp admin-get-user | ユーザーの詳細を取得 |
aws cognito-idp list-users | ユーザーを一覧表示 |
aws cognito-idp admin-set-user-password | パスワードを設定 |
aws cognito-idp admin-disable-user | ユーザーを無効化 |
認証
| コマンド | 説明 |
|---|---|
aws cognito-idp initiate-auth | 認証を開始 |
aws cognito-idp respond-to-auth-challenge | MFA に応答 |
aws cognito-idp admin-initiate-auth | 管理者認証 |
ベストプラクティス
セキュリティ
- すべてのユーザーに MFA を有効にする(少なくとも任意設定)
- 強力なパスワードポリシーを使用する
- 高度なセキュリティ機能を有効にする(アダプティブ認証)
- サインインを許可する前に メールアドレス/電話番号を確認する
- 機密性の高いアプリでは トークンの有効期間を短くする
- フロントエンドのコードで クライアントシークレットを決して公開しない
ユーザーエクスペリエンス
- すばやく実装するには ホスト型 UI を使用する
- CSS で UI をカスタマイズする
- 適切なエラー処理を実装する
- 明確なパスワード要件を提示する
アーキテクチャ
- AWS リソースへのアクセスには ID プールを使用する
- API Gateway には アクセストークンを使用する
- リフレッシュトークンを安全に保存する
- 有効期限が切れる前に トークンの更新を実装する
トラブルシューティング
ユーザーがサインインできない
原因:
- ユーザーが確認されていない
- パスワードが正しくない
- ユーザーが無効化されている
- アカウントがロックされている(試行回数が多すぎる)
デバッグ:
aws cognito-idp admin-get-user \
--user-pool-id us-east-1_abc123 \
--username [email protected]
トークンの検証に失敗する
原因:
- トークンの有効期限が切れている
- ユーザープール/クライアント ID が間違っている
- トークンの署名が無効
JWT の検証:
import jwt
import requests
# Get JWKS
jwks_url = f'https://cognito-idp.us-east-1.amazonaws.com/us-east-1_abc123/.well-known/jwks.json'
jwks = requests.get(jwks_url).json()
# Decode and verify (use python-jose or similar)
from jose import jwt
claims = jwt.decode(
token,
jwks,
algorithms=['RS256'],
audience='client-id',
issuer='https://cognito-idp.us-east-1.amazonaws.com/us-east-1_abc123'
)
ホスト型 UI が動作しない
確認項目:
- コールバック URL が正しく設定されている
- ユーザープールのドメインが設定されている
- OAuth の設定が有効になっている
# Check domain
aws cognito-idp describe-user-pool \
--user-pool-id us-east-1_abc123 \
--query 'UserPool.Domain'
レート制限
症状: TooManyRequestsException
解決策:
- 指数バックオフを実装する
- クォータの引き上げをリクエストする
- トークンを適切にキャッシュする
参考資料
コメント
Markdown 対応