Identity Platform と reCAPTCHA Enterprise API を統合する

このドキュメントでは、Identity Platform と reCAPTCHA Enterprise API のインテグレーションを使用してユーザーのセキュリティを強化する方法について説明します。この機能により、スパム、不正使用、その他の不正行為に対するアプリのレジリエンスが向上します。

この統合により、ユーザー リクエストを検証する reCAPTCHA Enterprise の評価が作成されます。料金については、reCAPTCHA の料金をご覧ください。

概要

Identity Platform と reCAPTCHA Enterprise API の統合を設定すると、reCAPTCHA のデフォルトの保護機能である reCAPTCHA bot 保護が有効になります。ボット対策を使用すると、Identity Platform がユーザーに代わってプロジェクトにスコアベースの reCAPTCHA キーをプロビジョニングします。ユーザーが次のいずれかの操作を使用してアプリまたはサイトにアクセスすると、対応するプロバイダが有効になっている場合に、クライアント SDK が reCAPTCHA を読み込みます。

プロバイダ オペレーション メソッド
passwordProvider メールとパスワードによるログイン signInWithPassword
メールとパスワードによる登録 signUpPassword
メールリンクによるログイン getOobCode
パスワードの再設定 getOobCode
phoneProvider 電話番号での登録またはログイン sendVerificationCode
MFA の電話番号の登録 mfaSmsEnrollment
MFA の電話番号によるログイン mfaSmsSignIn

その後、reCAPTCHA は、構成とリスク許容度に基づいてリクエストのリスクを評価するスコアを Identity Platform に提供します。

詳細については、reCAPTCHA の概要をご覧ください。

始める前に

reCAPTCHA で保護する認証フローの種類に応じて、次のことを設定します。

サービス アカウントを作成する

Identity Platform と reCAPTCHA Enterprise API の統合には、reCAPTCHA を使用するプロジェクトごとに Identity Platform サービス アカウントが必要です。これにより、Identity Platform がユーザーに代わって reCAPTCHA キーを管理できます。サービス アカウントをすでに作成している場合は、reCAPTCHA へのアクセス権を付与します。

サービス アカウントをまだ作成していない場合や、reCAPTCHA で保護するプロジェクトが他にもある場合は、次の操作を行います。

  1. Google Cloud CLI を使用してサービス アカウントを作成します。

    gcloud beta services identity create \
        --service=identitytoolkit.googleapis.com \
        --project=PROJECT_ID
    

    PROJECT_ID をそのプロジェクトの ID に置き換えます。

  2. サービス アカウントに reCAPTCHA へのアクセス権を付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-identitytoolkit.iam.gserviceaccount.com \
        --role=roles/identitytoolkit.serviceAgent
    

    以下を置き換えます。

    • PROJECT_ID: プロジェクト ID
    • PROJECT_NUMBER: プロジェクト アカウント番号

reCAPTCHA の bot 対策モード

reCAPTCHA の bot 保護には、ユーザーの保護に役立つ次の 2 つのモードがあります。監査モードと適用モードです。これらのモードの動作は、ID プロバイダによって異なります。

メールとパスワードのプロバイダ

メールとパスワードの認証フローでは、監査モードと適用モードは次のように動作します。

監査モード

メールとパスワードの適用を監査モードに設定すると、Identity Platform はプロジェクトに 1 つ以上の reCAPTCHA キーを作成し、リクエストをブロックせずに Identity Platform API へのトラフィックを評価するために使用します。監査モードで出力される指標を使用して、reCAPTCHA の適用を有効にするかどうかを判断します。

適用モード

メールとパスワードの適用を適用モードに設定すると、Identity Platform は、Identity Platform API へのトラフィックを評価するために使用される 1 つ以上の reCAPTCHA キーをプロジェクトに作成します。reCAPTCHA トークンを含まない API リクエストは拒否されます。reCAPTCHA をサポートする SDK にすべてのクライアントを移行した後にのみ、適用を有効にします。

携帯通信会社

スマートフォン認証フローでは、監査モードと適用モードは次のように動作します。

監査モード

電話認証の適用を監査モードに設定すると、Identity Platform はアプリの確認に reCAPTCHA ボット保護を使用します。ユーザー リクエストがボット保護評価に合格すると、Identity Platform は確認コードを含む SMS メッセージをユーザーのスマートフォンに送信します。リクエストがボット保護評価で不合格になり、クライアント SDK を使用している場合、フォールバック検証方法がトリガーされ、電話認証フローが完了します。使用できる代替手段は、アプリのプラットフォームによって異なります。

クライアント SDK は、次のシナリオでフォールバック検証メソッドをトリガーします。

  • reCAPTCHA トークンが見つかりません。
  • reCAPTCHA トークンが無効か、期限切れです。
  • reCAPTCHA トークンがスコア基準を満たしていない。
  • reCAPTCHA が正しく設定されていません。

アプリのプラットフォームのフォールバック確認方法が設定され、必要に応じて Client SDK によってトリガーされるように準備されていることを確認します。

ウェブ

初期の bot 保護評価が失敗した場合、監査モードでは reCAPTCHA v2 を使用して検証が行われます。そのため、reCAPTCHA 検証ツール(RecaptchaVerifier)を設定し、次の電話認証オペレーションに渡す必要があります。

  • verifyPhoneNumber
  • signInWithPhoneNumber
  • linkWithPhoneNumber
  • reauthenticateWithPhoneNumber
reCAPTCHA ベリファイアがないと、Identity Platform は reCAPTCHA v2 を開始できず、auth/argument-error を返します。reCAPTCHA ベリファイアの設定の詳細については、Firebase のドキュメントの reCAPTCHA ベリファイアを設定するをご覧ください。

Android

初期のボット保護評価が失敗した場合、監査モードは Play Integrity API と照らし合わせてアプリを検証します。この検証に失敗すると、reCAPTCHA v2 がトリガーされます。reCAPTCHA v2 は、次のシナリオでトリガーされる場合があります。

  • エンドユーザーのデバイスに Google Play 開発者サービスがインストールされていない場合。
  • (Authentication SDK v21.2.0 以降で)アプリが Google Play ストアを通じて配布されたものでない場合。
  • (Authentication SDK バージョン v21.2.0 より前で)取得した SafetyNet トークンが有効でない場合。
Android アプリの確認の設定の詳細については、Firebase ドキュメントのアプリの確認を有効にするをご覧ください。

iOS

最初のボット対策評価が失敗した場合、監査モードではサイレント プッシュ通知を使用して検証が行われます。この確認方法では、リクエスト元のデバイスのアプリにサイレント プッシュ通知でトークンを送信します。アプリが通知を正常に受信すると、スマートフォンの認証フローが進みます。アプリがプッシュ通知を受信しなかった場合、reCAPTCHA v2 がトリガーされます。サイレント プッシュ通知が正しく構成されていないと、reCAPTCHA v2 がトリガーされることがあります。

iOS アプリの検証を設定する方法については、Firebase ドキュメントのアプリの検証を有効にするをご覧ください。

強制適用モード

電話認証の適用を適用モードに設定すると、Identity Platform はアプリの確認に reCAPTCHA ボット保護を使用します。ユーザー リクエストがボット保護評価に合格すると、Identity Platform は確認コードを含む SMS メッセージをユーザーのスマートフォンに送信します。リクエストがボット保護評価に合格しなかった場合、Identity Platform はリクエストをブロックし、確認コードを含む SMS メッセージを送信しません。

適用モードでは、フォールバック検証は必要ないため、アプリに追加の検証方法を設定する必要はありません。ただし、アプリの reCAPTCHA モードを AUDIT または OFF に変更する場合は、ウェブアプリに reCAPTCHA 検証ツールを設定して、reCAPTCHA v2 が有効になるようにすることをおすすめします。

reCAPTCHA Enterprise API との Identity Platform の統合を設定する

Identity Platform と reCAPTCHA Enterprise API の統合を設定するには、次のタスクを行います。

  • Admin SDK を使用して reCAPTCHA の適用状態を設定し、bot 保護を有効にします。
  • アプリのプラットフォーム用にクライアント SDK を構成します。

最初に監査モードで reCAPTCHA の適用を有効にし、プロジェクトで出力される reCAPTCHA 指標をモニタリングして、認証フローが適切に保護されていることを確認することをおすすめします。これは、reCAPTCHA の使用状況を監査する際にユーザー トラフィックが中断されないようにするためです。認証フローが保護されていることを確認したら、ボット対策を ENFORCE に設定します。

reCAPTCHA による bot 対策を有効にする

メールとパスワードのプロバイダ

メール パスワード認証フローで reCAPTCHA ボット保護を有効にするには、次の操作を行います。

  1. まだ行っていない場合は、プロジェクトで reCAPTCHA Enterprise API を有効にします

  2. プロジェクトでボット対策を有効にするには、Admin SDK を使用します。reCAPTCHA のサポートは、Node.js Admin SDK バージョン 11.7.0 以降で利用できます。

    次に例を示します。

    // Update project config with reCAPTCHA config
    const updateConfigRequest = {
      recaptchaConfig: {
        emailPasswordEnforcementState:  'ENFORCE_MODE',
        managedRules: [{
          endScore: END_SCORE,
          action: 'BLOCK'
        }]
      }
    };
    const updateProjectConfigWithRecaptcha = () => {
      getAuth().projectConfigManager().updateProjectConfig(updateConfigRequest).then((response) => {
        console.log('Updated reCAPTCHA config for project: ', response.recaptchaConfig);
      }).catch((error) => {
        console.log('Error updating project config:', error);
      });
    }
    

    次のように置き換えます。

    • ENFORCE_MODE: reCAPTCHA のメールとパスワードによる認証の適用に設定するモード。有効な値は OFFAUDITENFORCE です。ボット対策を有効にするには、このパラメータを AUDIT または ENFORCE に設定する必要があります。ボット対策を初めて有効にする場合は、このパラメータを AUDIT に設定し、認証フローが保護されていることを確認してから、ENFORCE に設定することをおすすめします。モードの仕組みの詳細については、reCAPTCHA の bot 保護モードをご覧ください。
    • END_SCORE: リクエストが失敗する前に取得できるボット保護評価スコアの下限。このスコアは 0.01.0 の間で設定できます。たとえば、しきい値を 0.6 に設定すると、スコアが 0.5 以下のリクエストはすべて reCAPTCHA によって失敗します。スコアを高く設定すると、ルールが厳しくなります。

    Admin SDK を使用して、テナントに対して同じ構成方法でボット対策を有効にすることもできます。テナントの更新の詳細については、テナントを更新するをご覧ください。

  3. iOS または Android で Identity Platform を使用している場合は、Firebase コンソールからアプリを登録する必要があります。

    ウェブで Identity Platform を使用している場合は、reCAPTCHA を使用する各ドメインに対して承認済みドメインを追加する必要があります。承認済みドメインを追加するには、次の操作を行います。

    1. Google Cloud コンソールで、[Identity Platform] ページに移動します。

      Identity Platform に移動

    2. [設定] > [セキュリティ] に移動します。

    3. [ドメインを追加] をクリックします。

    4. ドメイン名を入力し、[追加] をクリックしてドメインを保存します。

    reCAPTCHA キーのプロビジョニングが完了するまでに数分かかることがあります。

  4. 適用を監査モードに設定している場合は、bot 保護用の reCAPTCHA 指標をモニタリングして、フローが保護されていることを確認することをおすすめします。

携帯通信会社

SMS ベースの認証フローで reCAPTCHA ボット保護を有効にするには、次の操作を行います。

  1. まだ行っていない場合は、プロジェクトで reCAPTCHA Enterprise API を有効にします

  2. プロジェクトでボット対策を有効にするには、Admin SDK を使用します。reCAPTCHA のサポートは、Node.js Admin SDK バージョン 12.7.0 以降で利用できます。

    次に例を示します。

    // Update project config with reCAPTCHA config
    const updateProjectConfigRequest = {
      recaptchaConfig: {
        phoneEnforcementState: 'ENFORCE_MODE',
        managedRules: [{ endScore: END_SCORE, action: 'BLOCK' }],
        useSmsBotScore: 'true',
      }
    }
    let projectConfig = await getAuth().projectConfigManager().updateProject(updateProjectConfigRequest);
    

    次のように置き換えます。

    • ENFORCE_MODE: reCAPTCHA の電話認証の適用に設定するモード。有効な値は OFFAUDITENFORCE です。SMS ベースのフローでボット対策を有効にするには、このパラメータを AUDIT または ENFORCE に設定し、useSmsBotScoretrue に設定する必要があります。

      ボット対策を初めて有効にする場合は、このパラメータを AUDIT に設定し、認証フローが保護されていることを確認してから、ENFORCE に設定することをおすすめします。モードの仕組みの詳細については、reCAPTCHA の bot 保護モードをご覧ください。

    • END_SCORE: リクエストが失敗する前に取得できるボット保護評価スコアの下限。このスコアは 0.01.0 の間で設定できます。たとえば、しきい値を 0.6 に設定すると、スコアが 0.5 以下のリクエストはすべて reCAPTCHA によって失敗します。スコアを高く設定すると、ルールが厳しくなります。

    Admin SDK を使用して、テナントに対して同じ構成方法でボット対策を有効にすることもできます。テナントの更新の詳細については、テナントを更新するをご覧ください。

  3. iOS または Android で Identity Platform を使用している場合は、Firebase コンソールからアプリを登録する必要があります。

    ウェブで Identity Platform を使用している場合は、reCAPTCHA を使用する各ドメインに対して承認済みドメインを追加する必要があります。承認済みドメインを追加するには、次の操作を行います。

    1. Google Cloud コンソールで、[Identity Platform] ページに移動します。

      Identity Platform に移動

    2. [設定] > [セキュリティ] に移動します。

    3. [ドメインを追加] をクリックします。

    4. ドメイン名を入力し、[追加] をクリックしてドメインを保存します。

    reCAPTCHA キーのプロビジョニングが完了するまでに数分かかることがあります。

  4. 適用を監査モードに設定している場合は、bot 保護の reCAPTCHA 指標をモニタリングして、フローが保護されていることを確認することをおすすめします。

クライアント SDK を構成する

アプリのプラットフォームに応じて、クライアント SDK を構成します。

Web

  1. 最新バージョンの Web SDK に更新します。

    • ウェブアプリでの メールとパスワードの認証に対する reCAPTCHA のサポートは、JavaScript SDK バージョン 9.20.0 以降で利用できます。
    • ウェブアプリでの電話認証の reCAPTCHA サポートは、JavaScript SDK バージョン 11 以降で利用できます。

    Web SDK をアプリと統合すると、SDK は reCAPTCHA 構成を自動的に取得し、構成したプロバイダの保護を有効にします。

  2. 必要に応じて、次のように reCAPTCHA シグナルを強制的に取得できます。

    import { initializeRecaptchaConfig } from '@firebase/auth';
    
    // Initialize Firebase Authentication
    const auth = getAuth();
    initializeRecaptchaConfig(auth)
      .then(() => {
        console.log("Recaptcha Enterprise Config Initialization successful.")
      })
      .catch((error) => {
        console.error("Recaptcha Enterprise Config Initialization failed with " + error)
      });
    

Android

  1. Android SDK の最新バージョンに更新します。Android アプリでのメールとパスワードの認証と電話認証の reCAPTCHA サポートは、Android SDK バージョン 23.1.0 以降で利用できます。

    また、reCAPTCHA のサポートには、API レベル 23(Marshmallow)以降と Android 6 以降が必要です。

    Android SDK をアプリと統合すると、SDK は reCAPTCHA 構成を自動的に取得し、構成したプロバイダの保護を有効にします。

  2. アプリレベルの build.gradle ファイルの依存関係セクションに、次のビルドルールを追加します。

    implementation 'com.google.android.recaptcha:recaptcha:18.5.1'
    

    reCAPTCHA SDK バージョン 18.5.1 以降を使用していることを確認します。

  3. 必要に応じて、次のように reCAPTCHA シグナルを強制的に取得できます。

    • Kotlin:
    // Initialize Firebase Authentication
    auth = Firebase.auth
    
    auth.initializeRecaptchaConfig().addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            Log.d(TAG, "Recaptcha Enterprise Initialization successful.")
        } else {
            Log.w(TAG, "Recaptcha Enterprise Initialization failed.")
        }
    }
    
    • Java:
    // Initialize Firebase Authentication
    auth = FirebaseAuth.getInstance();
    auth.initializeRecaptchaConfig().addOnCompleteListener(
      this, new OnCompleteListener<void>() {
      @Override
      public void onComplete(@NonNull Task<void> task) {
        if (task.isSuccessful()) {
          Log.d(TAG, "Recaptcha Enterprise Initialization successful.");
        } else {
          Log.w(TAG, "Recaptcha Enterprise Initialization failed.");
        }
      }
    });
    

iOS

  1. iOS SDK バージョン 11.6.0 以降に更新します。iOS SDK をアプリと統合すると、SDK は reCAPTCHA 構成を自動的に取得し、構成したプロバイダの保護を有効にします。

  2. reCAPTCHA iOS SDK をアプリに統合するには、環境を準備するをご覧ください。

  3. -ObjC がリンカーフラグに含まれていることを確認します。[Target] > [Build Settings] > [All] > [Linking] に移動し、Other Linker Flags-ObjC が表示されていることを確認します。

  4. 必要に応じて、次のように reCAPTCHA シグナルを強制的に取得できます。

    • Swift:
    // Initialize Firebase Authentication
    try await Auth.auth().initializeRecaptchaConfig()
    
    • Objective-C:
    // Initialize Firebase Authentication
    [[FIRAuth auth] initializeRecaptchaConfigWithCompletion:^(NSError * _Nullable error) {
      // Firebase Authentication initialization finished
    }];
    

reCAPTCHA 指標をモニタリングして bot 攻撃を防ぐ

reCAPTCHA の適用を適用モードに設定する前に、監査モードを使用してプロジェクトで出力される reCAPTCHA 指標をモニタリングし、認証フローが保護されていることを確認することをおすすめします。たとえば、これらの指標は、Identity Platform と reCAPTCHA Enterprise API の統合が正しく設定されているかどうかを判断するのに役立ちます。また、ユーザー トラフィックのスコア基準を微調整することもできます。reCAPTCHA キーのプロビジョニングが失敗するか、必要なサービス アカウントが作成されなかった場合でも、reCAPTCHA 認証の試行は正常に完了します。

プロジェクトで Cloud Monitoring に出力される次の指標を調べて、reCAPTCHA 認証が機能していることを確認します。

詳細については、reCAPTCHA 指標をモニタリングするをご覧ください。

reCAPTCHA ボット保護を適用する

アプリが許容できるユーザー トラフィックを受信していることを確認した後、ユーザーを保護するため reCAPTCHA の適用を有効化できます。古いバージョンのアプリを使用しているユーザーを含む、既存のユーザーを中断しないようにします。

メールとパスワードのプロバイダ

プロジェクトまたはテナントのメールとパスワードの認証フローで reCAPTCHA の適用を有効にするには、Admin SDK を使用して次のコマンドを実行します。

const enforceRequest = {
  recaptchaConfig: {
    emailPasswordEnforcementState:  'ENFORCE',
    }]
  }
};

携帯通信会社

プロジェクトまたはテナントで SMS ベースの認証フローで reCAPTCHA の適用を有効にするには、Admin SDK を使用して次のコマンドを実行します。

const enforceRequest = {
  recaptchaConfig: {
    phoneEnforcementState:  'ENFORCE',
    useSmsBotScore: 'true'
    }]
  }
};

reCAPTCHA による bot 対策を無効にする

メールとパスワードのプロバイダ

メールとパスワードの認証フローのボット保護を無効にするには、Admin SDK を使用して次のコマンドを実行します。

const disableRequest = {
  recaptchaConfig: {
    emailPasswordEnforcementState:  'OFF',
  }
};

携帯通信会社

SMS ベースの認証フローのボット対策を無効にするには、Admin SDK を使用して次のコマンドを実行します。

const disableRequest = {
  recaptchaConfig: {
    phoneEnforcementState:  'OFF',
    useSmsBotScore: 'false'
  }
};

Cloud Run functions を使用して reCAPTCHA の判定をオーバーライドする

スコアしきい値を構成するだけでなく、カスタム Cloud Run functions ブロッキング関数を使用して、特定のトークンに対する reCAPTCHA の判定をオーバーライドできます。これは、特定のユーザー ログインに対して reCAPTCHA スコアが低くなる可能性がある一方で、そのユーザーが信頼できるか、他の方法で検証されているため、ログインを完了できる場合に便利です。

reCAPTCHA でブロッキング関数を構成する方法については、ブロッキング Cloud Functions を使用して Firebase Authentication を拡張するをご覧ください。

次のステップ