翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon Cognito にカスタム属性を送信し、トークンに挿入する
Carlos Alessandro ribeiro と Mauricio Mendoza、Amazon Web Services
概要
Amazon Cognito 認証プロセスにカスタム属性を送信すると、アプリケーションに追加のコンテキストが提供され、より詳細なアクセスコントロールが可能になり、ユーザープロファイルと認証要件の管理が容易になります。これらの機能は、さまざまなアプリケーションやシナリオで有用であり、アプリケーションの全体的なセキュリティと機能を向上させるのに役立ちます。
このパターンは、アプリケーションがアクセストークンまたは ID (ID) トークンに追加のコンテキストを提供する必要がある場合に、Amazon Cognito 認証プロセスにカスタム属性を送信する方法を示しています。Node.js をバックエンドアプリケーションとして使用します。アプリケーションは Amazon Cognito ユーザープールからユーザーを認証し、トークン生成に必要なカスタム属性を渡します。Amazon Cognito AWS Lambda のトリガーを使用して、コードの大幅なカスタマイズや多大な労力をかけずに認証プロセスをカスタマイズできます。
重要
このパターンのコードとサンプルは、デモンストレーションのみを目的としているため、本番ワークロードには推奨されません。本番ワークロードの場合、クライアント側で追加の設定が必要です。このパターンは、パイロットまたはproof-of-conceptの目的でのみ参照してください。
前提条件と制限
前提条件
制約事項
このパターンは、クライアント認証情報認証フローを介したアプリケーション統合には適用されません。
トークン生成前トリガーは、アクセストークンと ID トークンの一部の属性のみを追加または変更できます。詳細については、Amazon Cognito ドキュメントの「トークン生成前 Lambda トリガー」を参照してください。
アーキテクチャ
ターゲット アーキテクチャ
次の図は、このパターンのターゲットアーキテクチャを示しています。また、Node.js アプリケーションがバックエンドと連携してデータベースを更新する方法も示します。ただし、バックエンドデータベースの更新はこのパターンの範囲外です。

この図表は、次のワークフローを示しています:
Node.js アプリケーションは、カスタム属性を持つアクセストークンを Amazon Cognito ユーザープールに発行します。
Amazon Cognito ユーザープールは、アクセストークンと ID トークンをカスタマイズするトークン生成前の Lambda 関数を開始します。
Node.js アプリケーションは、Amazon API Gateway を介して API コールを行います。
注記
このアーキテクチャに表示される他のアーキテクチャコンポーネントは、例えばのみであり、このパターンの対象外です。
自動化とスケール
、、HashiCorp Terraform
ツール
AWS のサービス
「Amazon API Gateway」は、任意のスケールで REST、HTTP、WebSocket API を作成、公開、維持、監視、保護する上で役立ちます。
Amazon Cognito は、ウェブおよびモバイルアプリの認証、認可、ユーザー管理を提供します。
「Amazon Elastic Container Service (Amazon ECS)」 は、クラスターでのコンテナの実行、停止、管理を支援する、高速でスケーラブルなコンテナ管理サービスです。
AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
AWS SDK for JavaScript は JavaScript API を提供します AWS のサービス。これを使用して、Node.js またはブラウザ用のライブラリまたはアプリケーションを構築できます。
その他のツール
ベストプラクティス
以下のベストプラクティスを実装することをお勧めします。
シークレットと機密データ – アプリケーション内にシークレットや機密データを保存しないでください。、、または AWS Systems Manager Parameter Store などAWS AppConfigAWS Secrets Manager、アプリケーションがデータを取得できる外部システムを使用します。
標準化されたデプロイ — CI/CD パイプラインを使用してアプリケーションをデプロイします。AWS CodeBuild や などのサービスを使用できますAWS CodePipeline。
トークンの有効期限 – アクセストークンの短い有効期限を設定します。
安全な接続を使用する – クライアントアプリケーションとバックエンド間のすべての通信は、SSL/TLS を使用して暗号化する必要があります。AWS Certificate Manager (ACM) を使用して SSL/TLS 証明書を生成および管理し、Amazon CloudFront または Elastic Load Balancing を使用して SSL/TLS の終了を処理します。
ユーザー入力の検証 – インジェクション攻撃やその他のセキュリティの脆弱性を防ぐために、すべてのユーザー入力が検証されていることを確認します。Amazon API Gateway や などの入力検証ライブラリとサービスAWS WAFを使用して、一般的な攻撃ベクトルを防止します。
IAM ロールを使用する – AWS Identity and Access Management (IAM) ロールを使用して AWS リソースへのアクセスを制御し、承認されたユーザーのみがアクセスできるようにします。最小特権の原則に従い、各ユーザーにロールを実行するために必要なアクセス許可のみがあることを確認します。
パスワードポリシーを使用する – 最小長、複雑さ、有効期限などのセキュリティ要件を満たすパスワードポリシーを設定します。Secrets Manager または AWS Systems Manager Parameter Store を使用して、パスワードを安全に保存および管理します。
多要素認証 (MFA) を有効にする – すべてのユーザーが MFA を有効にしてセキュリティを強化し、不正アクセスのリスクを軽減します。AWS IAM Identity Center または Amazon Cognito を使用して、MFA やその他の認証方法を有効にします。
機密情報を安全に保存する – AWS Key Management Service (AWS KMS) やその他の暗号化サービスを使用して、パスワードやアクセストークンなどの機密情報を安全に保存します。
強力な認証方法を使用する – 認証プロセスのセキュリティを強化するには、生体認証や多要素認証などの強力な認証方法を使用します。
疑わしいアクティビティのモニタリング – AWS CloudTrailおよびその他のモニタリングツールを使用して、疑わしいアクティビティや潜在的なセキュリティ脅威をモニタリングします。異常なアクティビティの自動アラートを設定し、Amazon GuardDuty または を使用して潜在的な脅威を検出AWS Security Hubします。
セキュリティポリシーを定期的に見直して更新する – セキュリティポリシーと手順を定期的に見直して更新し、変化するセキュリティ要件とベストプラクティスを満たしていることを確認します。を使用して AWS Config 、セキュリティポリシーと手順の変更を追跡および監査します。
自動サインアップ – Amazon Cognito ユーザープールへの自動サインアップを有効にしないでください。詳細については、Amazon Cognito ユーザープールによるユーザーサインアップ詐欺と SMS ポンピングのリスクを軽減する
」(AWS ブログ記事) を参照してください。
その他のベストプラクティスについては、Amazon Cognito ドキュメントの「Amazon Cognito ユーザープールのセキュリティのベストプラクティス」を参照してください。 Amazon Cognito
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
ユーザープールを作成します。 |
でユーザープールを設定する方法の詳細と手順については AWS Management Console、「ユーザープールの開始方法」および「ユーザープールに機能とセキュリティオプションを追加する」を参照してください。 https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-next-steps.html ヒントコストを削減するには、Essentials プランまたは Lite プランを使用してこのパターンをテストします。詳細については、「Amazon Cognito 料金 | アプリ開発者、AWS DevOps |
ユーザープールにユーザーを追加します。 | 次のコマンドを入力して、Amazon Cognito ユーザープールに 1 人のユーザーを作成します。
| アプリ開発者、AWS DevOps |
アプリケーションクライアントをユーザープールに追加します。 |
| AWS システム管理者、AWS 管理者、AWS DevOps、アプリ開発者 |
トークン生成前の Lambda トリガーを作成します。 |
| AWS DevOps、アプリケーション開発者 |
ユーザープールのワークフローをカスタマイズします。 |
詳細については、Amazon Cognito ドキュメントの「Lambda トリガーを使用したユーザープールワークフローのカスタマイズ」を参照してください。 | AWS DevOps、アプリケーション開発者 |
タスク | 説明 | 必要なスキル |
---|---|---|
Node.js アプリケーションを作成します。 |
| アプリ開発者 |
認証ロジックを実装します。 |
注記独自の TypeScript ファイルを作成することも、ユースケースに応じて提供されたサンプルを変更することもできます。 | アプリ開発者 |
環境変数と設定ファイルを設定します。 | ターミナルで、次のコマンドを入力して環境変数を作成します。
重要シークレットをハードコードしたり、認証情報を公開したりしないでください。 | アプリ開発者 |
アプリケーションを実行します。 | 次のコマンドを入力してアプリケーションを実行し、アプリケーションが動作していることを確認します。
| アプリ開発者 |
カスタム属性がトークンに挿入されていることを確認します。 | IDE のデバッグ機能を使用して、アクセストークンと ID トークンを表示します。カスタム属性が追加されていることを確認します。サンプルトークンについては、このパターンの追加情報「追加情報」セクションを参照してください。 | アプリ開発者 |
トラブルシューティング
問題 | ソリューション |
---|---|
ユーザーの認証時に無効なクライアント ID | このエラーは通常、生成されたクライアントシークレットでクライアント ID を使用している場合に発生します。シークレットをアタッチせずにクライアント ID を作成する必要があります。詳細については、「アプリケーションクライアントでのアプリケーション固有の設定」を参照してください。 |
関連リソース
Lambda トリガーを使用したユーザープールワークフローのカスタマイズ (Amazon Cognito ドキュメント)
トークン生成前の Lambda トリガー (Amazon Cognito ドキュメント)
CognitoIdentityProviderClient (AWS SDK for JavaScript ドキュメント)
cognito-idp
(AWS CLI ドキュメント)
追加情報
サンプル TypeScript ファイル
次のコードサンプルは、 AWS SDK を使用して Amazon Cognito にカスタム属性を送信することで認証プロセスを呼び出す TypeScript ファイルです。
import * as AmazonCognitoIdentity from "amazon-cognito-identity-js"; const userPoolId: string = process.env.USER_POOL_ID ?? ''; const clientId: string = process.env.CLIENT_ID ?? ''; const poolData = { UserPoolId: userPoolId, ClientId: clientId }; const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); export const loginWithCognitoSDK = function (userName: string, password: string) { const authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails({ Username: userName, Password: password, ClientMetadata: { customGroup: "MyCustomGroup", customApplicationData: "Custom data from a custom application" } }); const userData = { Username: userName, Pool: userPool }; const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); // Authenticate the user using the authenticationDetails object cognitoUser.authenticateUser(authenticationDetails, { onSuccess: function (result: any) {}, onFailure: function (err: any) {}, }); } loginWithCognitoSDK(process.env.USERNAME ?? '', process.env.PASSWORD ?? '');
このサンプルでは、SDK for JavaScript のAuthenticationDetails
モデルを使用して、ユーザー名、パスワード、および を提供しますClientMetadada
。Amazon Cognito での認証後、アクセストークンと ID トークンからクライアントメタデータを取得できます。
サンプル Lambda 関数
次のコードサンプルは、Amazon Cognito から生成前トークンにリンクされた Lambda 関数です。Amazon Cognito が使用するアクセストークンと ID トークンをカスタマイズするのに役立ちます。トークンは、アーキテクチャ間の統合を介して渡されます。このサンプルには、 というカスタムクレーム属性customApplicationData
と というカスタムグループ名が含まれていますMyCustomGroup
。
export const handler = async(event, context, callback) => { event.response = { claimsOverrideDetails: { claimsToAddOrOverride: { customApplicationData: event.request.clientMetadata.customApplicationData }, groupOverrideDetails: { groupsToOverride: [event.request.clientMetadata.customGroup] } } }; callback(null, event); };
サンプルアクセストークン
アクセストークンをデコードして、追加されたカスタム属性を視覚化できます。以下は、アクセストークンのサンプルです。
{ "sub": "6daf331f-4451-48b4-abde-774579299204", "cognito:groups": [ "MyCustomGroup" ], "iss": "https://cognito-idp.<REGION>.amazonaws.com/<USERPOOL_ID>", "client_id": "<YOUR_CLIENT_ID>", "origin_jti": "acff7e91-09f9-4fde-8eec-38b0f8c47cdc", "event_id": "c5113a9c-1f01-435b-9b73-a5cd3e88514e", "token_use": "access", "scope": "aws.cognito.signin.user.admin", "auth_time": 1677979246, "exp": 1677982846, "iat": 1677979246, "jti": "5c9c2708-a871-4428-bd9b-18ad261bea90", "username": "<USER_NAME>" }
サンプル ID トークン
アクセストークンをデコードして、追加されたカスタム属性を視覚化できます。以下は、アクセストークンのサンプルです。
{ "sub": "6daf331f-4451-48b4-abde-774579299204", "cognito:groups": [ "MyCustomGroup" ], "iss": "https://cognito-idp.<REGION>.amazonaws.com/<USERPOOL_ID>", "cognito:username": "<USER_NAME>", "origin_jti": "acff7e91-09f9-4fde-8eec-38b0f8c47cdc", "customApplicationData": "Custom data from a custom application", "aud": "<YOUR_CLIENT_ID>", "event_id": "c5113a9c-1f01-435b-9b73-a5cd3e88514e", "token_use": "id", "auth_time": 1677979246, "exp": 1677982846, "iat": 1677979246, "jti": "f7ca006b-f25b-44d2-a7a4-6e6423f4201f", "email": "<USER_EMAIL>" }