Amazon Cognito にカスタム属性を送信し、トークンに挿入する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon Cognito にカスタム属性を送信し、トークンに挿入する

Carlos Alessandro Ribeiro と Mauricio Mendoza、Amazon Web Services

概要

Amazon Cognito 認証プロセスにカスタム属性を送信すると、アプリケーションに追加のコンテキストが提供され、より詳細なアクセス制御が可能になり、ユーザープロファイルと認証要件の管理が容易になります。これらの機能は、さまざまなアプリケーションやシナリオで役立ち、アプリケーションの全体的なセキュリティと機能の向上につながります。

このパターンは、アプリケーションがアクセストークンまたは アイデンティティ (ID) トークンに追加のコンテキストを提供する必要がある場合に、Amazon Cognito 認証プロセスにカスタム属性を送信する方法を示しています。Node.js をバックエンドアプリケーションとして使用します。アプリケーションは Amazon Cognito ユーザープールからユーザーを認証し、トークン生成に必要なカスタム属性を渡します。Amazon Cognito の AWS Lambda トリガーを使用すると、コードの大幅なカスタマイズなどの多大な労力をかけることなく認証プロセスをカスタマイズできます。

重要

このパターンのコードとサンプルは、デモンストレーションのみを目的としているため、実稼働ワークロードには推奨されません。実稼働ワークロードの場合、クライアント側で追加の設定が必要です。このパターンは、パイロットまたは概念実証の目的でのみ参照してください。

前提条件と制限

前提条件

制限事項

  • このパターンは、クライアント認証情報の認証フローを介したアプリケーション統合には適用されません。

  • トークン生成前トリガーは、アクセストークンと ID トークンの一部の属性のみを追加または変更できます。詳細については、Amazon Cognito ドキュメントの「Pre token generation Lambda trigger」を参照してください。

アーキテクチャ

ターゲットアーキテクチャ

このパターンのターゲットアーキテクチャを次の図に示します。また、Node.js アプリケーションがバックエンドと連携してデータベースを更新する方法も示します。ただし、バックエンドデータベースの更新はこのパターンの範囲外です。

Amazon Cognito ユーザープールにカスタム属性を持つアクセストークンを発行する Node.js アプリケーション。

この図表は、次のワークフローを示しています:

  1. Node.js アプリケーションは、カスタム属性を持つアクセストークンを Amazon Cognito ユーザープールに発行します。

  2. Amazon Cognito ユーザープールは、アクセストークンと ID トークンをカスタマイズするトークン生成前 Lambda 関数を開始します。

  3. Node.js アプリケーションは、Amazon API Gateway を介して API コールを行います。

注記

このアーキテクチャに表示される他のアーキテクチャコンポーネントは、例を目的としたもので、このパターンの範囲外です。

自動化とスケール

、、HashiCorp Terraform、またはサポートされている Infrastructure as Code (IaC) ツールを使用して、Amazon Cognito ユーザープール、 AWS Lambda 関数AWS CloudFormationAWS Cloud Development Kit (AWS CDK)、データベースインスタンス、およびその他のリソースのプロビジョニングを自動化できます。デプロイをスケールする場合は、継続的インテグレーションおよび継続的デリバリー (CI/CD) パイプラインを使用します。これにより、手動デプロイに関連するエラーを防ぐことができます。

ツール

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 のサービス。JavaScript API を使用して、Node.js またはブラウザ用のライブラリまたはアプリケーションを構築できます。

その他のツール

  • Node.js は、スケーラブルなネットワークアプリケーションを構築するために設計された、イベント駆動型の JavaScript ランタイム環境です。

  • npm は Node.js 環境で動作するソフトウェアレジストリで、パッケージの共有や借用、プライベートパッケージのデプロイ管理に使用されます。

ベストプラクティス

ACM のベストプラクティスを実装することをおすすめします。

  • シークレットと機密データ – アプリケーション内にシークレットや機密データを保存しないでください。AWS AppConfigAWS Secrets Manager、または AWS Systems Manager Parameter Store など、アプリケーションがデータを取得できる外部システムを使用します。

  • 標準化されたデプロイ – CI/CD パイプラインを使用してアプリケーションをデプロイします。AWS CodeBuildAWS 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 アイデンティティセンター または Amazon Cognito を使用して、MFA やその他の認証方法を有効にします。

  • 機密情報を安全に保存するAWS Key Management Service (AWS KMS) やその他の暗号化サービスを使用して、パスワードやアクセストークンなどの機密情報を安全に保存します。

  • 強力な認証方法を使用する – 認証プロセスのセキュリティを強化するには、生体認証や多要素認証などの強力な認証方法を使用します。

  • 疑わしいアクティビティのモニタリングAWS CloudTrail およびその他のモニタリングツールを使用して、疑わしいアクティビティや潜在的なセキュリティ脅威をモニタリングします。異常なアクティビティの自動アラートを設定し、Amazon GuardDuty または AWS Security Hub CSPM を使用して潜在的な脅威を検出します。

  • セキュリティポリシーを定期的に見直して更新する – セキュリティポリシーと手順を定期的に見直して更新し、変化するセキュリティ要件とベストプラクティスを満たしていることを確認します。を使用して AWS Config 、セキュリティポリシーと手順の変更を追跡および監査します。

  • 自動サインアップ – Amazon Cognito ユーザープールへの自動サインアップを有効にしないでください。詳細については、Amazon Cognito ユーザープールによるユーザーサインアップ詐欺と SMS ポンピングのリスクを軽減する」(AWS ブログ記事) を参照してください。

その他のベストプラクティスについては、Amazon Cognito ドキュメントの「Security best practices for Amazon Cognito user pools」を参照してください。

エピック

タスク説明必要なスキル

ユーザープールの作成

  1. CLI ターミナルで、次のコマンドを入力して Amazon Cognito ユーザープールを作成します。

    aws cognito-idp create-user-pool \ --pool-name <MyUserPool>
  2. 次のコマンドを入力して、SDK for JavaScript で使用するクライアント ID とシークレットを作成します。

    aws cognito-idp create-user-pool-client \ --user-pool-id <UserPoolID> \ --client-name <MyNewClient> \ --no-generate-secret \ --explicit-auth-flows "USER_PASSWORD_AUTH" "ADMIN_NO_SRP_AUTH"

でユーザープールを設定する方法の詳細と手順については AWS マネジメントコンソール、「ユーザープールの開始方法」および「ユーザープールに機能とセキュリティオプションを追加する」を参照してください。 https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-next-steps.html

ヒント

コストを削減するには、Essentials プランまたは Lite プランを使用してこのパターンをテストします。詳細については、「Amazon Cognito 料金」を参照してください。

アプリ開発者、AWS DevOps

ユーザープールにユーザーを追加します。

次のコマンドを入力して、Amazon Cognito ユーザープールに 1 人のユーザーを作成します。

aws cognito-idp sign-up \ --client-id <ClientID> \ --username <jane@example.com> \ --password <PASSWORD> \ --user-attributes Name="email",Value="<jane@example.com>" Name="name",Value="<Jane>"
アプリ開発者、AWS DevOps

ユーザープールにアプリクライアントを追加します。

  1. Amazon Cognitoコンソール に移動します。

  2. [User pools] (ユーザープール) を選択します。

  3. 先ほど作成したユーザープールを選択します。

  4. [アプリケーションの定義] で、認証および認可サービスを作成するアプリケーションシナリオに最適なアプリケーションタイプを選択します。

  5. [アプリケーションに名前を付ける] で、わかりやすい名前を入力するか、デフォルト名に進みます。

  6. [戻り URL を追加] に、ユーザーが認証を完了した後のアプリケーションへのリダイレクトパスを入力します。

  7. [アプリケーションを作成する] を選択します。アプリクライアントを作成した後、高度なオプションを設定できます。

AWS システム管理者、AWS 管理者、AWS DevOps、アプリケーション開発者

トークン生成前の Lambda トリガーを作成します。

  1. Lambda コンソールの [関数] ページを開きます。

  2. [関数の作成] を選択してください。

  3. [一から作成] を選択します。

  4. [基本情報] ペインで、[関数名] に「myPreTokenGenerationLambdaFunction」を入力します。

  5. [ランタイム][Node.js 22] を選択します。

  6. [アーキテクチャ][x86_64] のままにします。

  7. [関数の作成] を選択してください。

  8. [コード] タブの [コードソース] に、このパターンの追加リソースセクションからサンプルの Lambda 関数を入力します。この Lambda 関数は、カスタム属性を ID トークンとアクセストークンに挿入します。

AWS DevOps、アプリ開発者

ユーザープールのワークフローをカスタマイズします。

  1. Amazon Cognitoコンソール に移動します。

  2. [User pools] (ユーザープール) を選択します。

  3. 先ほど作成したユーザープールを選択します。

  4. 左側のナビゲーションペインの [認証] で、[拡張機能] を選択します。

  5. [Lambda トリガーの追加] を選択します。

  6. トークン生成前トリガーを追加または編集します。

  7. [トリガータイプ] で、[認証] を選択します。

  8. [認証] で、[トークン生成前トリガー] を選択します。

  9. Lambda 関数を指定するにはmyPreTokenGenerationLambdaFunction を選択します。

  10. [Lambda トリガーの追加] を選択します。

  11. 基本機能 + ユーザー ID のアクセストークンのカスタマイズまたは基本機能 + ユーザー ID とマシン ID のアクセストークンのカスタマイズトリガーイベントバージョンを選択します。この設定により、Amazon Cognito が関数に送信するリクエストパラメータが更新され、アクセストークンをカスタマイズするためのフィールドが含まれるようになります。

詳細については、Amazon Cognito ドキュメントの「Customizing user pool workflows with Lambda triggers」を参照してください。

AWS DevOps、アプリ開発者
タスク説明必要なスキル

Node.js アプリケーションを作成します。

  1. ターミナルで、以下のコマンドを入力します。

    mkdir my-app cd my-app npm init -y npm install --save-dev typescript npm i --save-dev @types/node npm i amazon-cognito-identity-js npx tsc --init mkdir src touch src/index.ts
  2. package.json ファイルを変更して TypeScript コンパイルスクリプトを含めます。

    "scripts": { "start": "node src/index.js", "build": "tsc" },
アプリ開発者

認証ロジックを実装します。

  1. index.ts ファイルを開きます。

  2. このパターンの「追加リソース」セクションにあるサンプルの Typescript を貼り付けます。

  3. index.ts ファイルを保存して閉じます。

注記

独自の TypeScript ファイルを作成することも、ユースケースに応じて提供されたサンプルを変更することもできます。

アプリ開発者

環境変数と設定ファイルを構成します。

ターミナルで、次のコマンドを入力して環境変数を作成します。

export USERNAME="<COGNITO_USER_NAME>" export PASSWORD="<COGNITO_USER_PASSWORD>" export USER_POOL_ID="<COGNITO_USER_ID>" export CLIENT_ID="<COGNITO_CLIENT_ID>"
重要

シークレットをハードコーディングしたり、認証情報を公開したりしないでください。

アプリ開発者

アプリケーションを実行します。

次のコマンドを入力してアプリケーションを実行し、アプリケーションが動作していることを確認します。

npm run build npm start
アプリ開発者

カスタム属性がトークンに挿入されていることを確認します。

IDE のデバッグ機能を使用して、アクセストークンと ID トークンを表示します。カスタム属性が追加されていることを確認します。サンプルクエリについては、このパターンの「追加情報」セクションを参照してください。

アプリデベロッパー

トラブルシューティング

問題ソリューション

ユーザーの認証時の無効なクライアント ID

通常このエラーは、生成されたクライアントシークレットでクライアント ID を使用している場合に発生します。シークレットをアタッチせずにクライアント ID を作成する必要があります。詳細については、「Application-specific settings with app clients」を参照してください。

関連リソース

追加情報

サンプルの 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>" }