將 Identity Platform 與 reCAPTCHA Enterprise API 整合

本文說明如何使用 Identity Platform 整合 reCAPTCHA Enterprise API,為使用者提供更完善的安全性。這項功能可讓應用程式更能抵禦垃圾內容、濫用行為和其他詐欺活動。

整合作業會代您建立 reCAPTCHA Enterprise 評估,以便驗證使用者要求。如需價格資訊,請參閱 reCAPTCHA 定價

總覽

設定 Identity Platform 與 reCAPTCHA Enterprise API 的整合時,您會啟用 reCAPTCHA 的預設防護功能:reCAPTCHA 機器人防護功能。啟用機器人防護功能後,Identity Platform 會代表您在專案中提供以分數為準的 reCAPTCHA 金鑰。當使用者使用下列任一作業存取您的應用程式或網站時,如果已啟用對應的供應器,用戶端 SDK 就會載入 reCAPTCHA。

供應商 作業 方法
passwordProvider 電子郵件和密碼登入 signInWithPassword
使用電子郵件地址和密碼註冊 signUpPassword
電子郵件連結登入 getOobCode
重設密碼 getOobCode
phoneProvider 使用電話號碼註冊或登入 sendVerificationCode
多重身分驗證電話號碼註冊 mfaSmsEnrollment
使用多重驗證的電話號碼登入 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 機器人防護模式

reCAPTCHA 機器人防範功能有兩種模式可協助保護使用者:稽核強制執行。這些模式的行為會因識別資訊提供者而異。

電子郵件密碼提供者

在電子郵件/密碼驗證流程中,稽核和強制執行模式的行為如下所示。

稽核模式

將電子郵件密碼強制執行設為稽核模式時,Identity Platform 會在專案中建立一或多個 reCAPTCHA 金鑰,用於評估 Identity Platform API 的流量,且不會封鎖任何要求。使用稽核模式中產生的指標,判斷是否應啟用 reCAPTCHA 強制執行功能。

強制執行模式

將電子郵件密碼強制執行設為強制模式時,Identity Platform 會在專案中建立一或多個 reCAPTCHA 金鑰,用於評估 Identity Platform API 的流量。系統會拒絕不含 reCAPTCHA 權杖的 API 要求。請務必在將所有用戶端遷移至支援 reCAPTCHA 的 SDK 後,才啟用強制執行功能。

電話供應商

在電話驗證流程中,稽核模式和強制執行模式的行為如下所述。

稽核模式

將電話驗證強制執行設為稽核模式時,Identity Platform 會使用 reCAPTCHA 機器人保護機制進行應用程式驗證。如果使用者要求通過機器人防護評估,身分識別平台就會傳送含有驗證碼的簡訊至使用者的手機。如果要求無法通過機器人防護評估,且您使用的是用戶端 SDK,系統會觸發備用驗證方法,以便完成電話驗證流程。系統接受的備用方法取決於應用程式的平台。

用戶端 SDK 會在下列情況下觸發備用驗證方法:

  • 缺少 reCAPTCHA 權杖。
  • reCAPTCHA 權杖無效或已過期。
  • reCAPTCHA 權杖未通過分數門檻。
  • reCAPTCHA 設定不正確。

請確認已為應用程式平台設定備用驗證方法,並準備好在必要時由用戶端 SDK 觸發。

網頁

如果初始的機器人防護評估失敗,稽核模式會使用 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 服務。
  • 如果應用程式並非透過 Google Play 商店發行 (在 Authentication SDK 21.2.0 以上版本)。
  • 如果取得的 SafetyNet 權杖無效 (在 Authentication SDK 21.2.0 以下版本)。
如要進一步瞭解如何設定 Android 應用程式驗證,請參閱 Firebase 說明文件中的「啟用應用程式驗證」一文。

iOS

如果初始的機器人防護評估失敗,稽核模式會使用靜默推播通知進行驗證。這個驗證方法會透過靜默推送通知,將權杖傳送至要求裝置上的應用程式。如果應用程式成功收到通知,手機驗證流程就會繼續。如果應用程式未收到推送通知,系統會觸發 reCAPTCHA v2。如果未正確設定靜默推送通知,系統可能會觸發 reCAPTCHA v2。

如要進一步瞭解如何設定 iOS 應用程式驗證,請參閱 Firebase 說明文件中的「啟用應用程式驗證」一文。

強制執行模式

將電話驗證強制執行設為強制模式時,Identity Platform 會使用 reCAPTCHA 機器人防護功能進行應用程式驗證。如果使用者要求通過機器人防護評估,身分識別平台就會傳送含有驗證碼的簡訊至使用者的手機。如果要求未通過機器人防護評估,Identity Platform 會封鎖要求,且不會傳送內含驗證碼的簡訊。

強制模式不需要備用驗證機制,因此您不必為應用程式設定任何額外的驗證方法。不過,如果您決定將應用程式的 reCAPTCHA 模式變更為 AUDITOFF,建議您為網頁應用程式設定 reCAPTCHA 驗證器,以確保啟用 reCAPTCHA v2。

設定 Identity Platform 與 reCAPTCHA Enterprise API 的整合

如要設定 Identity Platform 與 reCAPTCHA Enterprise API 的整合,請執行下列工作:

  • 使用 Admin SDK 設定 reCAPTCHA 執行狀態,並啟用機器人防護功能。
  • 為應用程式平台設定用戶端 SDK。

建議您先在稽核模式中啟用 reCAPTCHA 強制執行功能,並監控專案產生的 reCAPTCHA 指標,確保驗證流程受到妥善保護。這樣一來,您就能在稽核使用者使用 reCAPTCHA 的情況下,不中斷使用者流量。驗證驗證流程是否受到保護後,請將機器人防護設為 ENFORCE

啟用 reCAPTCHA 機器人防護功能

電子郵件密碼提供者

如要為電子郵件/密碼驗證流程啟用 reCAPTCHA 機器人防護功能,請按照下列步驟操作:

  1. 如果您尚未在專案中啟用 reCAPTCHA Enterprise API,請先完成這項作業。

  2. 如要為專案啟用機器人防護功能,請使用 Admin SDK。Node.js Admin SDK 11.7.0 以上版本支援 reCAPTCHA。

    例如:

    // 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。如要啟用機器人防護功能,這個參數必須設為 AUDITENFORCE。首次啟用機器人防護功能時,建議您先將此參數設為 AUDIT,並確保驗證流程受到保護,再將參數設為 ENFORCE。如要進一步瞭解模式的運作方式,請參閱「reCAPTCHA 機器人防護模式」。
    • END_SCORE:要求失敗前,可獲得的最低機器人保護評估分數。您可以將這項分數設為介於 0.01.0 之間。舉例來說,如果您將閾值設為 0.6,reCAPTCHA 就會拒絕任何 0.5 以下的請求。因此,分數越高,規則就越嚴格。

    您也可以使用 Admin SDK 為租用戶啟用相同的設定方法來防範機器人。如要進一步瞭解如何更新租用戶,請參閱「更新租用戶」。

  3. 如果您在 iOS 或 Android 上使用 Identity Platform,則必須透過 Firebase 控制台註冊應用程式:

    如果您在網站上使用 Identity Platform,則必須為每個使用 reCAPTCHA 的網域新增授權網域。如要新增授權網域,請按照下列步驟操作:

    1. 在 Google Cloud 控制台中,前往「Identity Platform」頁面。

      前往 Identity Platform

    2. 依序前往「設定」>「安全性」

    3. 按一下「新增網域」

    4. 輸入網域名稱,然後按一下「新增」,儲存網域。

    reCAPTCHA 金鑰佈建作業可能需要幾分鐘才能完成。

  4. 如果您已將強制執行設為稽核模式,建議您監控 reCAPTCHA 指標以防機器人攻擊,確保流程受到保護。

電話供應商

如要為簡訊驗證流程啟用 reCAPTCHA 機器人防範功能,請按照下列步驟操作:

  1. 如果您尚未在專案中啟用 reCAPTCHA Enterprise API,請先完成這項作業。

  2. 如要為專案啟用機器人防護功能,請使用管理員 SDK。Node.js 管理員 SDK 12.7.0 以上版本支援 reCAPTCHA。

    例如:

    // 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。如要為以簡訊為基礎的流程啟用機器人防護功能,請務必將這個參數設為 AUDITENFORCE,並將 useSmsBotScore 設為 true

      首次啟用機器人保護功能時,建議您將此參數設為 AUDIT,並確保驗證流程受到保護,然後再將此參數設為 ENFORCE。如要進一步瞭解模式的運作方式,請參閱「reCAPTCHA 機器人防護模式」。

    • END_SCORE:要求失敗前,可獲得的最低機器人保護評估分數。您可以將這項分數設為介於 0.01.0 之間。舉例來說,如果您將閾值設為 0.6,reCAPTCHA 就會拒絕任何 0.5 以下的請求。因此,分數越高,規則就越嚴格。

    您也可以使用 Admin SDK 為租用戶啟用相同的設定方法來防範機器人。如要進一步瞭解如何更新租用戶,請參閱「更新租用戶」。

  3. 如果您在 iOS 或 Android 上使用 Identity Platform,則必須透過 Firebase 控制台註冊應用程式:

    如果您在網站上使用 Identity Platform,則必須為每個使用 reCAPTCHA 的網域新增授權網域。如要新增已授權網域,請按照下列步驟操作:

    1. 在 Google Cloud 控制台中,前往「Identity Platform」頁面。

      前往 Identity Platform

    2. 依序前往「設定」>「安全性」

    3. 按一下「新增網域」

    4. 輸入網域名稱,然後按一下「新增」,儲存網域。

    reCAPTCHA 金鑰佈建作業可能需要幾分鐘才能完成。

  4. 如果您已將強制執行設為稽核模式,建議您監控 reCAPTCHA 指標以防機器人攻擊,確保流程受到保護。

設定用戶端 SDK

根據應用程式的平台設定用戶端 SDK。

網頁版

  1. 更新至最新版的 Web SDK

    • JavaScript SDK 9.20.0 以上版本支援在網頁應用程式中使用 reCAPTCHA 進行電子郵件和密碼驗證
    • JavaScript SDK 11 以上版本支援在網頁應用程式中使用 reCAPTCHA 進行電話驗證

    將網路 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 指標,防範機器人攻擊

在將 reCAPTCHA 強制執行設定為強制模式前,建議您先使用稽核模式,並監控專案產生的 reCAPTCHA 指標,確保驗證流程受到保護。舉例來說,這些指標可協助您判斷是否已正確設定 Identity Platform 與 reCAPTCHA Enterprise API 的整合。這類資料也能協助您微調使用者流量的分數門檻。如果 reCAPTCHA 金鑰佈建失敗,或未建立必要的服務帳戶,reCAPTCHA 驗證嘗試仍會正常成功。

請檢查專案向 Cloud Monitoring 發出的下列指標,確認 reCAPTCHA 驗證功能是否正常運作:

詳情請參閱「監控 reCAPTCHA 指標」。

強制執行 reCAPTCHA 機器人防護功能

確認應用程式收到可接受的使用者流量後,您就可以啟用 reCAPTCHA 強制執行功能來保護使用者。請務必確保不會影響現有使用者,包括可能使用舊版應用程式的使用者。

電子郵件密碼提供者

如要在專案或租用戶上啟用電子郵件密碼驗證流程的 reCAPTCHA 強制執行功能,請使用 Admin SDK 執行下列操作:

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

電話供應商

如要在專案或租用戶上啟用 reCAPTCHA 強制執行功能,以便針對簡訊驗證流程執行 reCAPTCHA,請使用 Admin SDK 執行下列操作:

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

停用 reCAPTCHA 機器人防護功能

電子郵件密碼提供者

如要停用電子郵件/密碼驗證流程的機器人保護功能,請使用 Admin SDK 執行下列指令:

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

電話供應商

如要停用以 SMS 為基礎的驗證流程的機器人防護功能,請使用 Admin SDK 執行下列指令:

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

使用 Cloud Run 函式覆寫 reCAPTCHA 判定結果

除了設定分數門檻之外,您還可以使用自訂 Cloud Run 函式封鎖函式,覆寫特定符記的 reCAPTCHA 判定結果。在某些使用者登入時,reCAPTCHA 評分可能偏低,但使用者是可信任的,或已透過其他方式驗證,因此可完成登入程序,這時這項功能就很有幫助。

如要進一步瞭解如何使用 reCAPTCHA 設定封鎖函式,請參閱「透過封鎖式 Cloud Functions 擴充 Firebase 驗證」。

後續步驟