mcpField
C
cognito

cognito

github.com/itsmostafaセキュリティ1.2k187 回インストール2 日前に更新
リポジトリ

cognito について

Web・モバイルアプリで AWS Cognito による認証、認可、ユーザー管理を設定する開発者向けのリファレンスです。ユーザープール、アイデンティティプール、トークン、CLI 操作、トラブルシューティングを扱います。

主な機能

  1. 01ユーザープールの登録と認証
  2. 02フェデレーション ID と一時認証情報
  3. 03OAuth 2.0、OIDC、トークン管理
  4. 04AWS CLI の主なコマンド
  5. 05セキュリティ指針とトラブルシューティング

活用シーン

  1. 01アプリのユーザー登録とログイン設定
  2. 02ユーザーの MFA とパスワードポリシー設定
  3. 03AWS リソースアクセス用の認証情報取得
  4. 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-challengeMFA に応答
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

解決策:

  • 指数バックオフを実装する
  • クォータの引き上げをリクエストする
  • トークンを適切にキャッシュする

参考資料

コメント