將應用程式連線至驗證模擬器

在應用程式中使用驗證模擬器前,請務必瞭解整體 Firebase 本機模擬器套件的工作流程,並安裝及設定本機模擬器套件並查看其 CLI 指令

本主題假設您已熟悉如何針對實際工作環境開發 Firebase 驗證解決方案。如有需要,請參閱平台與驗證技術組合的說明文件。

驗證模擬器提供哪些功能?

驗證模擬器提供高精確度的本機模擬 Firebase 驗證服務,提供實際工作環境 Firebase 驗證中的許多功能。與 Apple 平台、Android 和 Web Firebase SDK 配對的模擬器可讓您:

  • 建立、更新及管理模擬使用者帳戶,用於測試電子郵件/密碼、電話號碼/簡訊、簡訊多重驗證和第三方 (例如 Google) 識別資訊提供者驗證
  • 查看及編輯模擬使用者
  • 設計自訂權杖驗證系統的原型
  • 在模擬器 UI 記錄分頁中查看驗證相關訊息。

選擇 Firebase 專案

Firebase 本機模擬器套件可模擬單一 Firebase 專案中的產品。

如要選取要使用的專案,請先透過 CLI 在工作目錄中執行 firebase use,再啟動模擬器。或者,您也可以將 --project 標記傳遞至每個模擬器指令。

本機模擬器套件支援模擬「實際」的 Firebase 專案和示範專案。

專案類型 功能與特色 與模擬器搭配使用
真實

真正的 Firebase 專案是您建立及設定的專案 (很有可能透過 Firebase 控制台進行)。

真實專案包含使用中的資源,例如資料庫執行個體、儲存空間值區、函式,或是您為該 Firebase 專案設定的任何其他資源。

使用實際的 Firebase 專案時,您可以針對任何或所有支援的產品執行模擬器。

針對並非您要模擬的任何產品,應用程式和程式碼會與即時資源 (資料庫執行個體、儲存空間值區、函式等) 互動。

示範

示範 Firebase 專案沒有實際的 Firebase 設定,也沒有即時資源。一般來說,您可以透過程式碼研究室或其他教學課程存取這些專案。

示範專案的專案 ID 含有 demo- 前置字串。

使用示範 Firebase 專案時,您的應用程式和程式碼「只會」與模擬器互動。如果應用程式嘗試與未執行模擬器的資源互動,該程式碼將會失敗。

建議您盡可能使用示範專案。Meet 具備以下優點:

  • 設定更簡單,因為您無須建立 Firebase 專案即可執行模擬器
  • 安全性較高,因為如果程式碼意外叫用非模擬的 (正式環境) 資源,就無法變更資料、使用及計費
  • 改善離線支援功能,因為不需透過網際網路即可下載 SDK 設定。

檢測應用程式,以便與模擬器通訊

Android、iOS 和網頁 SDK

進行應用程式內設定或測試類別,以與驗證模擬器互動,如下所示。

Kotlin+KTX
Firebase.auth.useEmulator("10.0.2.2", 9099)
Java
FirebaseAuth.getInstance().useEmulator("10.0.2.2", 9099);
Swift
Auth.auth().useEmulator(withHost:"127.0.0.1", port:9099)

Web

import { getAuth, connectAuthEmulator } from "firebase/auth";

const auth = getAuth();
connectAuthEmulator(auth, "http://127.0.0.1:9099");

Web

const auth = firebase.auth();
auth.useEmulator("http://127.0.0.1:9099");

無須額外設定,即可針對 Cloud Firestore 或即時資料庫的驗證與 Cloud Functions 或 Firebase 安全性規則,進行原型設計及測試互動。設定驗證模擬器且正在執行其他模擬器後,這些模擬器就會自動搭配運作。

管理員 SDK

設定 FIREBASE_AUTH_EMULATOR_HOST 環境變數後,Firebase Admin SDK 會自動連線至驗證模擬器。

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

請注意,Cloud Functions 模擬器會自動得知驗證模擬器,因此您可以在測試 Cloud Functions 和驗證模擬器之間的整合作業時略過這個步驟。系統會在 Cloud Functions 中自動為 Admin SDK 設定環境變數。

設定環境變數後,Firebase Admin SDK 就會接受驗證模擬器所核發的未簽署 ID 權杖和工作階段 Cookie (分別透過 verifyIdTokencreateSessionCookie 方法),以便進行本機開發和測試。請「不要」在實際工作環境中設定環境變數。

如要讓 Admin SDK 程式碼連線至在其他環境中執行的共用模擬器,您必須指定使用 Firebase CLI 設定的相同專案 ID。您可以將專案 ID 直接傳遞至 initializeApp,或是設定 GCLOUD_PROJECT 環境變數。

Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
環境變數
export GCLOUD_PROJECT="your-project-id"

ID 權杖

基於安全考量,驗證模擬器會發出「未簽署」 ID 權杖,只有其他 Firebase 模擬器或 Firebase Admin SDK 在設定時才會接受。在正式環境模式下執行的 Firebase 服務或 Firebase Admin SDK 會拒絕這些權杖 (例如未進行上述設定步驟的預設行為)。

啟動模擬器

您可以透過模擬器套件 UI 以互動方式使用驗證模擬器,但無法透過本機 REST 介面以非互動方式使用。以下各節說明互動式和非互動式用途。

如要啟動驗證模擬器、其 REST 介面,以及模擬器套件 UI,請執行下列指令:

firebase emulators:start

如果是匿名驗證,應用程式可執行平台的登入邏輯 (iOSAndroid網頁)。

對於電子郵件/密碼驗證,您可以透過 Authentication SDK 方法,將使用者帳戶新增至驗證模擬器,或是使用模擬器套件 UI 來開始設計原型。

  1. 在模擬器套件 UI 中,按一下「Authentication」分頁標籤。
  2. 按一下「新增使用者」按鈕
  3. 按照使用者帳戶建立精靈的指示填寫電子郵件驗證欄位。

建立測試使用者後,應用程式可透過您平台的 SDK 邏輯,讓使用者登入及登出 (iOSAndroid網頁)。

針對以電子郵件連結流程測試電子郵件驗證/登入的情況,模擬器會列印網址至執行 firebase emulators:start 的終端機。

i  To verify the email address customer@ex.com, follow this link:
http://127.0.0.1:9099/emulator/action?mode=verifyEmail&lang=en&oobCode=XYZ123&apiKey=fake-api-key

將連結貼到瀏覽器中以模擬驗證事件,並檢查驗證是否成功。

{
  "authEmulator": {
    "success": "The email has been successfully verified.",
    "email": "customer@example.com"
  }
}

為測試密碼重設作業,模擬器會向終端機輸出類似網址,包括 newPassword 參數 (您可以視需要變更)。

http://127.0.0.1:9099/emulator/action?mode=resetPassword&oobCode=XYZ!23&apiKey=fake-api-key&newPassword=YOUR_NEW_PASSWORD

非互動式測試

您可以撰寫測試設定指令碼,以呼叫 REST API 來建立及刪除使用者帳戶,並擷取頻外電子郵件驗證碼,填入模擬器電子郵件驗證網址,而不必使用模擬器套件 UI 或用戶端程式碼管理電子郵件/密碼使用者帳戶。這樣做可將平台與測試程式碼分開,且讓您以非互動的方式測試。

針對非互動式電子郵件和密碼測試流程,典型的順序如下所示。

  1. 透過驗證 signUp REST 端點建立使用者。
  2. 運用電子郵件地址和密碼登入使用者進行測試。
  3. 如果您的測試適用,請從模擬器專用 REST 端點擷取可用的頻外電子郵件驗證碼。
  4. 使用模擬器專屬的 REST 端點清除使用者記錄,以便清除資料。

模擬電話/簡訊驗證

驗證模擬器不支援電話驗證:

  • reCAPTCHA 和 APN 流程。設定與模擬器互動後,用戶端 SDK 會停用這些驗證方法,方法與整合測試 (iOSAndroid網頁) 類似。
  • 使用 Firebase 控制台預先設定的驗證碼測試電話號碼。

否則,就用戶端程式碼而言,電話/簡訊驗證流程與正式版 (iOSAndroid網頁) 所述的一樣。

使用模擬器套件 UI:

  1. 在模擬器套件 UI 中,按一下「Authentication」分頁標籤。
  2. 按一下「新增使用者」按鈕
  3. 按照使用者帳戶建立精靈的指示填寫電話驗證欄位。

不過,如果是手機驗證流程,模擬器「不會」觸發任何簡訊的傳送作業,因為聯絡電信業者並不在支援範圍內,也不適合進行本機測試!而是會輸出透過簡訊傳送至您執行 firebase emulators:start 的同一個終端機,在應用程式中輸入這段程式碼,模擬使用者查看簡訊的情況。

非互動式測試

針對非互動式手機驗證測試,請使用驗證模擬器 REST API 擷取可用的簡訊驗證碼。請注意,每次啟動流程時的程式碼都會不同。

一般流程如下。

  1. 呼叫平台 signInWithPhoneNumber 以啟動驗證程序。
  2. 使用模擬器專屬的 REST 端點擷取驗證碼。
  3. 照常撥打 confirmationResult.confirm(code),並提供驗證碼。

簡訊多重驗證

驗證模擬器支援在實際工作環境中針對 iOSAndroid網頁提供的簡訊多重驗證 (MFA) 流程進行原型設計和測試。

將模擬使用者新增至模擬器時,可以啟用 MFA 並設定一或多組電話號碼,用於傳送次要驗證簡訊。訊息會輸出至您執行 firebase emulators:start 的同一個終端機,且可從 REST 介面取得。

模擬第三方識別資訊提供者 (IDP) 驗證

驗證模擬器可讓您在 iOS、Android 或網頁應用程式中測試許多第三方驗證流程,無須變更正式版程式碼。如需驗證流程的範例,請參閱說明文件中的各種可在應用程式中使用的供應商和平台組合

一般來說,您可以透過下列其中一種方式,使用 Firebase SDK 進行驗證:

  • 應用程式可讓 SDK 處理整個程序的端對端作業,包括與第三方 IdP 供應商擷取憑證的所有互動。
  • 您的應用程式會使用第三方的 SDK 手動擷取第三方供應商的憑證,並將這些憑證傳遞至 Authentication SDK。

請再次查看上方的說明文件連結,並確認自己瞭解要使用的流程是 Firebase SDK 管理和手動擷取憑證的流程。驗證模擬器支援任一方法的測試。

測試 Firebase SDK 導向的 IDP 流程

如果您的應用程式使用任何 Firebase SDK 端對端流程 (例如使用 OAuthProvider 透過 Microsoft、GitHub 或 Yahoo 登入) 進行互動式測試,驗證模擬器會提供對應登入頁面的本機版本,協助您從呼叫 signinWithPopupsignInWithRedirect 方法的網頁應用程式測試驗證。這個本機提供的登入頁面也會顯示在行動應用程式中,由平台的 WebView 程式庫轉譯。

模擬器繼續進行流程時,模擬器會視需要建立模擬第三方使用者帳戶和憑證。

使用手動憑證擷取測試 IdP 流程

如果您使用「手動」登入方式,並呼叫平台的 signInWithCredentials 方法,應用程式就會照常要求第三方登入,並擷取真正的第三方憑證。

請注意,模擬器僅支援從 Google 登入、Apple 和以 JSON Web Token (JWT) 形式實作的 ID 權杖擷取憑證的 signInWithCredential 驗證。系統不支援存取權杖 (例如由 Facebook 或 Twitter 提供的,而非 JWT)。下一節將討論這種情況的替代方案。

非互動式測試

非互動式測試的一種方法是,在模擬器提供的登入頁面上自動使用者點擊。如果是網頁應用程式,請使用 WebDriver 等控制介面。如果是行動裝置,請使用平台提供的 UI 測試工具,例如 Espresso 或 Xcode。

或者,您也可以更新程式碼以使用 signInWithCredential (例如程式碼分支版本),並透過帳戶模擬 ID 權杖使用權杖驗證流程,而非實際憑證。

  1. 重新連接或註解掉程式碼部分 (從 IDP 擷取 idToken) 時,不必在測試期間輸入真實的使用者名稱和密碼,還能免除 IDP 的 API 配額和頻率限制測試。
  2. 接著,使用常值 JSON 字串取代 signInWithCredential 的權杖。以網頁 SDK 為例,您可以將程式碼變更為:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

與模擬器搭配使用時,這個程式碼會在 Google 成功驗證電子郵件 foo@example.com 的使用者。請將子欄位當成主鍵,可變更為任何字串,模擬不同使用者的登入程序。您可以將 firebase.auth.GoogleAuthProvider 替換為 new firebase.auth.OAuthProvider('yahoo.com') 或要模擬的任何其他提供者 ID。

模擬自訂權杖驗證

驗證模擬器會使用在支援平台上對 signInWithCustomToken 方法的呼叫,以自訂 JSON Web Token 處理驗證,如實際驗證說明文件中所述。

驗證模擬器與正式環境的差異

Firebase 驗證模擬器會模擬正式版產品的多項功能。不過,任何類型的驗證系統主要仰賴多個層級的安全性 (裝置、第三方供應商、Firebase 等),因此模擬器很難正確重新建立所有流程。

Cloud IAM

Firebase 模擬器套件不會試圖複製或尊重任何在執行時與 IAM 相關的行為。模擬器符合所提供的 Firebase 安全性規則,但在通常會使用 IAM 的情況下 (例如設定 Cloud Functions 叫用服務帳戶,因此權限),模擬器將無法設定,而且將使用開發人員機器上的全域可用帳戶,類似直接執行本機指令碼。

由於在行動平台上,電子郵件連結登入作業需仰賴 Firebase 動態連結,因此所有這類連結都會改在行動 (行動) 網路平台上開啟。

第三方登入

針對第三方登入流程,Firebase 驗證需要使用 Twitter 和 GitHub 等第三方供應商的安全憑證。

驗證模擬器接受 OpenID Connect 供應商 (例如 Google 和 Apple) 提供的真實憑證。不支援來自非 OpenID Connect 供應商的憑證。

電子郵件 / 簡訊登入

在正式版應用程式中,電子郵件和簡訊登入流程包含非同步作業,使用者可在此作業中檢查收到的訊息,並在登入介面中輸入登入代碼。驗證模擬器不會傳送任何電子郵件或簡訊,但如上文所述,它會產生登入代碼,並輸出至終端機以供測試使用。

模擬器不支援使用固定登入代碼定義測試電話號碼的功能,這可透過 Firebase 控制台完成。

自訂權杖驗證

驗證模擬器不會驗證自訂權杖的簽名或到期日。這樣一來,您就能在原型設計和測試情境中使用手動編寫的權杖,並無限期重複使用權杖。

頻率限制 / 反濫用

驗證模擬器不會複製實際工作環境頻率限製或反濫用功能。

封鎖函式

在實際工作環境中,在 beforeCreatebeforeSignIn 事件觸發後,系統會將使用者寫入儲存空間一次。不過,基於技術上的限制,驗證模擬器會寫入兩次儲存,一次在使用者建立後和登入後進行另一次。也就是說,對於新使用者,您可以在驗證模擬器中成功呼叫 beforeSignIn 中的 getAuth().getUser(),但可能會在實際工作環境中發生錯誤。

接下來呢?