Amazon Cognito のトラブルシューティング - Amazon Cognito

Amazon Cognito のトラブルシューティング

この章では、Amazon Cognito の使用中に発生する可能性がある一般的な問題の解決策を示します。Amazon Cognito の実装は、認証フロー、ユーザープール設定、ID フェデレーション設定のすべてにわたって、さまざまな課題に直面する可能性があります。新しいアプリケーションを開発する場合でも、既存のアプリケーションを維持する場合でも、このトラブルシューティングガイドは一般的な問題をすばやく特定して解決するのに役立ちます。

カスタムドメインの設定エラー

Amazon Cognito でカスタムドメイン名を設定する場合、エラーメッセージが表示されることがあります。一般的なエラーには、検証の問題、証明書の問題、ドメインの競合などがあります。

Custom domain is not a valid subdomain

このエラーは、親ドメインの DNS 解決の問題を示しています。Amazon Cognito は最上位ドメインをサポートしていないため、親ドメインには検証のための DNS A レコードが必要です。

問題

このエラーは、親ドメインの DNS 解決の問題を示しています。Amazon Cognito は最上位ドメインをサポートしていないため、親ドメインには検証のための DNS A レコードが必要です。

ソリューション
  • 親ドメインの A レコードを作成する: カスタムドメインの親ドメインで DNS 設定に A レコードを作成する必要があります。

    • 例: カスタムドメインが auth.xyz.yourdomain.com である場合、親ドメインは xyz.yourdomain.com です。xyz.yourdomain.com をカスタムドメインとして設定する場合、親ドメインは yourdomain.com です。

    • 親ドメインは、有効な IP アドレスに解決する必要があります。実際の IP アドレスを指さない場合は、ダミーの IP アドレス (8.8.8.8 など) を使用できます。

  • DNS 伝達の検証 (オプション、ただし推奨): DNS プロバイダーが変更を伝達したことを確認するには、dig コマンドを実行できます。

    • auth.xyz.yourdomain.com をカスタムドメインとして使用する場合: dig A xyz.yourdomain.com +short

    • xyz.yourdomain.com をカスタムドメインとして使用する場合: dig A yourdomain.com +short

    • コマンドは、設定した IP アドレスを返す必要があります。そうでない場合は、変更が完全に反映されるまで待ちます。

  • 親ドメインの A レコードを削除する: Amazon Cognito でカスタムドメインを正常に作成したら、親ドメイン用に作成した A レコード (ダミーである場合)を削除できます。

詳細については、「ホストされた UI で独自のドメインを使用する」を参照してください。

Domain already associated with another user pool

カスタムドメイン名は、すべての AWS アカウントおよびリージョンにわたって一意である必要があります。

問題

カスタムドメイン名は、すべての AWS アカウントおよびリージョンにわたって一意である必要があります。

ソリューション
  • 新しいユーザープールにドメイン名を使用するには、現在関連付けられているユーザープールからカスタムドメインを削除する必要があります。

  • 削除後に待機する: カスタムドメインが最初のユーザープールから完全に削除されるまで時間がかかります。削除直後に同じ名前で新しいカスタムドメインを作成すると、このエラーが発生する可能性があります。数分待ってから、もう一度試してください。

One or more of the CNAMEs that you provided are already associated with a different resource

カスタムドメインを作成すると、Amazon Cognito は AWS マネージド Amazon CloudFront ディストリビューションを作成します。ドメイン名は、1 つの Amazon CloudFront ディストリビューションでのみ使用できます。このエラーは、ドメイン名が別の Amazon CloudFront ディストリビューションの代替ドメインとして既に使用されている場合に発生します。

問題

カスタムドメインを作成すると、Amazon Cognito は AWS マネージド Amazon CloudFront ディストリビューションを作成します。ドメイン名は、1 つの Amazon CloudFront ディストリビューションでのみ使用できます。このエラーは、ドメイン名が別の Amazon CloudFront ディストリビューションの代替ドメインとして既に使用されている場合に発生します。

ソリューション
  • オプション 1: Amazon Cognito カスタムドメインに別のドメイン名を使用します。

  • オプション 2: Amazon Cognito でドメイン名を使用している場合は、別の Amazon CloudFront ディストリビューションで同じ名前を使用しません。

The specified SSL certificate doesn't exist

Amazon Cognito で使用する Amazon CloudFront では、ユーザープールのリージョンを問わず、AWS Certificate Manager (ACM) 証明書を us-east-1 (バージニア北部) AWS リージョンに保持する必要があります。

問題

Amazon Cognito で使用する Amazon CloudFront では、ユーザープールのリージョンを問わず、AWS Certificate Manager (ACM) 証明書を us-east-1 (バージニア北部) AWS リージョンに保持する必要があります。

ソリューション
  • 証明書リージョンを確認する: ACM 証明書が us-east-1 リージョンにあることを確認します。

  • 証明書の有効性を確認する: 選択した証明書の有効期限が切れていないことを確認します。

  • インポートした証明書: 証明書を ACM にインポートした場合は、以下を確認します。

    • パブリック認証局によって発行されたものである。

    • 正しい証明書チェーンが含まれている。

  • AWS KMS ポリシーチェック: ドメインを作成する IAM ユーザーまたはロールの AWS Key Management Service (AWS KMS) ポリシー内に明示的な deny ステートメントがある場合、このエラーが発生する可能性があります。特に、kms:DescribeKeykms:CreateGrant、または kms:* アクションの明示的な拒否を確認します。

Invalid refresh token エラー

問題

更新トークンを使用して、AdminInitiateAuth または InitiateAuth API オペレーションで Amazon Cognito ユーザープールから新しいアクセストークンや ID トークンを取得しようとすると、Invalid refresh token エラーが発生します。

ソリューション

ユーザープールの設定と API の使用状況に応じて、次のトラブルシューティング手順を実装します。

  • 一貫したアプリケーションクライアント ID を確認する: トークン更新のために AdminInitiateAuthまたは InitiateAuth API を呼び出すときは、最初の認証時に更新トークンの生成に使用したのとまったく同じアプリケーションクライアント ID を使用する必要があります。

  • デバイスを確認する: ユーザープールでデバイス追跡を有効にしていても、ユーザーのデバイスが未確認である場合は、まず ConfirmDevice API を呼び出す必要があります。ユーザーがデバイスを確認したら、更新トークンを交換できます。

  • 更新リクエストにデバイスキーを含める: デバイス追跡が有効になっている場合は、REFRESH_TOKEN_AUTH フローの使用時に一意のデバイスキーを AuthParameter として含めます。

    { "AuthFlow": "REFRESH_TOKEN_AUTH", "AuthParameters": { "REFRESH_TOKEN": "example_refresh_token", "SECRET_HASH": "example_secret_hash", // Required if your app client uses a client secret "DEVICE_KEY": "example_device_key" } }
  • デバイス追跡に USER_SRP_AUTH を使用する: デバイス追跡を使用している場合、初期認証フローは USER_SRP_AUTH である必要があります。

詳細については、「ユーザープール内のユーザーデバイスの使用」を参照してください。

フェデレーションでの無効な SAML レスポンスエラー

ユーザーが SAML 2.0 を使用して Amazon Cognito にフェデレーションしようとすると、さまざまな Invalid SAML response エラーや同様のエラーが発生します。これらのエラーは、属性マッピングの問題、証明書の問題、または設定の不一致が原因で発生する可能性があります。

Invalid user attributes: Required attribute

問題

ユーザープールで必須属性の値が欠落しているか、IdP がイミュータブルな属性を削除または更新しようとしています。

ソリューション
  • ユーザープール設定に定義されている必須属性を確認します。

  • ブラウザでネットワークキャプチャツールを使用して、SAML レスポンスを取得します。URL と base64 のデコードが必要になる場合があります。属性が SAML アサーションに存在することを確認します。

  • ID プロバイダーにサインインし、プロバイダーから Amazon Cognito に送信している属性を確認します。IdP が正しい名前を使用して必須属性を送信するように設定されていることを確認します。

  • イミュータブルな属性の場合は、次の AWS CLI コマンドを実行して属性を特定します: aws cognito-idp describe-user-pool --user-pool-id USER-POOL-ID --query 'UserPool.SchemaAttributes[?Mutable==`false`].Name'

  • IdP の SAML 属性マッピングで、イミュータブルな Amazon Cognito 属性をターゲットとしているマッピングをすべて削除します。または、送信先属性を別の変更可能な属性に更新します。

Invalid SAML response received: SAML Response signature is invalid

問題

IdP が SAML 署名証明書を更新したため、SAML レスポンスの証明書と Amazon Cognito に保存されているメタデータファイルが一致しません。

ソリューション
  1. IdP から最新のメタデータファイルをダウンロードします。

  2. Amazon Cognito コンソールで、ユーザープールの [ソーシャルプロバイダーと外部プロバイダー] に移動して SAML プロバイダーを編集し、既存のメタデータファイルを新しくダウンロードしたファイルに置き換えます。

Audience restriction-または-Application with identifier not found

問題

IdP で正しくないエンティティ ID が設定されているか、アサーションが別のユーザープールの Uniform Resource Name (URN) を使用しています。

ソリューション
  1. コンソールの [概要] セクションから Amazon Cognito ユーザープール ID を取得します。

  2. IdP のマネジメントコンソールで、ユーザープールの SAML アプリケーションのエンティティ ID を更新します。形式が urn:amazon:cognito:sp:USER_POOL_ID と一致するようにエンティティ ID を設定します。USER_POOL_ID を、前のステップのユーザープール ID に置き換えます。

An error was encountered with the requested page

問題

IdP に登録されているアサーションコンシューマーサービス (ACS) の URL が正しく設定されていないか、IdP が必要な POST バインディングを使用して SAML レスポンスを送信していません。

ソリューション
  • IdP のマネジメントコンソールで、アプリケーションを更新して正しい ACS URL 形式を反映し、アプリケーションが HTTP POST バインディングを使用していることを確認します。

  • デフォルトドメイン形式: https://cognito-idp.Region.amazonaws.com/your user pool ID/saml2/idpresponse

  • カスタムドメイン形式: https://auth.example.com/saml2/idpresponse

Invalid relayState from identity provider

問題

RelayState パラメータが欠落しているか、無効であるか、IdP と Amazon Cognito の間で URL が一致していません。

ソリューション

詳細については、「ユーザープールによる SAML ID プロバイダーの使用」を参照してください。

マネージドログインユーザーが MFA 要素を選択できない

問題

ユーザーは、マネージドログインでサインインするときに希望する MFA の方法を選択できないか、または希望する MFA の方法を入力するよう求められません。

ソリューション

Amazon Cognito は、特定のロジックに従い、ユーザープールの設定、ユーザー属性、アカウント復旧設定に基づいてユーザーが利用できる MFA 要素を決定します。例えば、E メールがプライマリのアカウント復旧方法として設定されている場合、ユーザーは E メール MFA を使用できません。

MFA 要素のデフォルトの選択を上書きするには、次のいずれかのアプローチを実装できます。

  • パブリックアプリケーションの場合: 有効なアクセストークンで SetUserMFAPreference を使用して、ユーザーが希望する MFA を選択できるよう設定します。

  • 管理者が管理するアプリケーションの場合: AWS 認証情報で AdminSetUserMFAPreference を使用してユーザーが希望する MFA を選択できるよう設定します。

どちらのオペレーションでも、ユーザーごとに SMS、E メール、TOTP MFA 方法を有効または無効にし、希望する方法として 1 つを設定できます。

詳細については、「ユーザープールに MFA を追加します」を参照してください。

パスワードなしのユーザーとパスキーユーザーは MFA を使用できません

問題

パスワードなしの認証方法またはパスキーでサインインするユーザーは、多要素認証を追加または使用できません。

ソリューション

これは意図された制限です。ユーザーが MFA 要素を使用するか、パスワードなしの要素でサインインするようユーザープールを設定できますが、両方を設定することはできません。MFA はパスワードベースの認証フローでのみ使用できます。

詳細については、「ユーザープールによる認証」を参照してください。

E メール/SMS 経由でパスワードリセットコードを受信できない

問題

ユーザーは、パスワードを忘れた場合のワークフローで、E メールまたは SMS を通じて検証コードを受信できません。

ソリューション

検証コードが受信できない理由はさまざまです。この問題のトラブルシューティングを行うには、次のチェックリストに従います。

  • ユーザーの E メールのスパムフォルダと迷惑メールフォルダを確認します。

  • ユーザープールにユーザーが存在することを確認します。

  • ユーザーのステータスが FORCE_CHANGE_PASSWORD でないことを確認します。このステータスである場合、ユーザーは管理者によって作成されており、Amazon Cognito は、ユーザーが仮パスワードを使用してサインインするときにパスワードを設定するよう求めます。

  • ユーザーの E メールまたは電話番号の属性が検証済みであることを確認します。

  • SMS メッセージングのアカウント使用制限を確認する

  • Amazon Simple Email Service (Amazon SES) のメッセージ送信クォータを確認します。

  • SMS と Amazon SES の両方 (ユーザープールが [Amazon SES で E メールを送信] に設定されている場合) がサンドボックス外に移動されているかどうかを確認します。サンドボックス外に移動されていない場合、Amazon SES または AWS End User Messaging SMS によって検証されていない E メールアドレスまたは電話番号は、パスワードリセットコードを受信できません。

  • ユーザーがアクティブな MFA 要素を持っている場合は、同じ要素へのメッセージを生成しようとしていないことを確認します。例えば、E メール MFA がアクティブであるユーザーは、パスワードリセットコードを E メールで送信できません。

詳細については、「Amazon Cognito ユーザープールの E メール設定」および「Amazon Cognito ユーザープール用の SMS メッセージ設定」を参照してください。

SECRET_HASH エラー

問題

クライアントシークレットを持つアプリケーションクライアントへの認証 API リクエストが An error occurred (NotAuthorizedException) when calling the ForgotPassword operation: Client 1example23456789 is configured with secret but SECRET_HASH was not received. などのエラーを返す

ソリューション

アプリケーションは、現在のユーザー、アプリケーションクライアント、クライアントシークレットについて、SECRET_HASH を計算する必要があります。計算方法は次のとおりです。

Base64 ( HMAC_SHA256 ( "client secret", "Username" + "Client Id" ) )

クライアントシークレットを取得するには、以下の操作ができます。

  1. Amazon Cognito コンソールを開き、[アプリケーションクライアント] メニューからアプリケーションクライアントに移動します。[アプリケーションクライアント情報] セクションで、[クライアントシークレット] を見つけます。[クライアントシークレットを表示] を選択すると、アプリケーションのクライアントシークレットが表示されます。

  2. DescribeUserPoolClient リクエストを生成します。クライアントシークレットがレスポンスに含まれます。

詳細については、「シークレットハッシュ 値の計算」を参照してください。

Amazon Cognito コンソールが、新しいユーザープールにデフォルト設定を選択する

問題

コンソールで新しいユーザープールを設定すると、Amazon Cognito はいくつかのデフォルト設定を選択します。一部の設定は、ユーザープールの作成後に変更できません。情報に基づいた選択を行い、Amazon Cognito が自動的に何を選択したかを確認するにはどうすればよいですか?

ソリューション

Amazon Cognito コンソールの新しいユーザープールの設定は、迅速なテストとプロトタイプ作成のために設計されています。コンソールには、ユーザープールの作成後に変更できない、最も重要な設定オプションのみが表示されます。Amazon Cognito が自動的に設定する他のすべての設定は、後で変更できます。

次のようなアプローチを推奨します。

  1. コンソールを使用して、テストユーザープールを作成し、実装を改善します。

  2. 本番稼働用設定を決定したら、この設定をテストユーザープールに適用します。

  3. DescribeUserPool および DescribeUserPoolClient API オペレーションを使用して、テスト済み設定の JSON テンプレートを生成します。

  4. このテンプレートを AWS SDK、CDK、REST API、または CloudFormation などのデプロイツールで使用して、本番稼働リソースを作成します。

詳細については、「ユーザープールの開始方法」を参照してください。

その他のトラブルシューティングリソース

その他のトラブルシューティングガイダンスとコミュニティから提供されたソリューションについては、以下の外部リソースも参照してください。