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

在應用程式中使用 Authentication 模擬器之前,請務必瞭解 Firebase Local Emulator Suite 的整體工作流程,並安裝及設定 Local Emulator Suite,以及查看其 CLI 指令。

本主題假設您已熟悉如何開發正式環境的 Firebase Authentication 解決方案。如有需要,請參閱平台和驗證技術組合的說明文件。

Authentication 模擬器有哪些功能?

Authentication 模擬器提供高擬真度的 Firebase Authentication 服務本機模擬,提供正式版 Firebase Authentication 的大部分功能。搭配 Apple 平台、Android 和網頁 Firebase SDK,模擬器可讓您:

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

選擇 Firebase 專案

Firebase Local Emulator Suite會模擬單一 Firebase 專案的產品。

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

Local Emulator Suite 支援模擬「實際」Firebase 專案和「示範」專案。

專案類型 功能 與模擬器搭配使用
實數

實際的 Firebase 專案是指您建立及設定的專案 (通常是透過 Firebase 控制台)。

實際專案含有實際資源,例如資料庫執行個體、Storage bucket、函式,或您為該 Firebase 專案設定的其他資源。

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

對於未模擬的產品,應用程式和程式碼會與實際資源 (資料庫執行個體、儲存空間 bucket、函式等) 互動。

示範

Firebase 示範專案沒有「實際」Firebase 設定,也沒有任何實際資源。這類專案通常是透過程式碼實驗室或其他教學課程存取。

示範專案的專案 ID 具有 demo- 前置字元。

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

建議您盡可能使用試用專案。包括以下優點:

  • 設定更簡單,因為您不必建立 Firebase 專案,就能執行模擬器
  • 安全性更高,因為如果程式碼不小心叫用非模擬 (正式環境) 資源,資料、用量和帳單就不會變更
  • 更完善的離線支援,因為不需要連上網際網路,即可下載 SDK 設定。

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

Android、iOS 和網頁版 SDK

請按照下列步驟設定應用程式內設定或測試類別,以便與 Authentication 模擬器互動。

Kotlin
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)
Unity
FirebaseAuth auth = FirebaseAuth.DefaultInstance;
// Connects to the Auth Emulator running on port 9099
auth.UseEmulator("127.0.0.1", 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 或 Realtime Database 的 Authentication 與 Cloud Functions 或 Firebase Security Rules 之間的互動建立原型並進行測試。設定 Authentication 模擬器並執行其他模擬器後,這些模擬器會自動搭配運作。

Admin SDK 秒

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

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

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

設定環境變數後,Firebase Admin SDK 會接受 Authentication 模擬器核發的未簽署 ID 權杖和工作階段 Cookie (分別透過 verifyIdToken 和 createSessionCookie 方法),以利本機開發和測試。請務必不要在正式環境中設定環境變數。

如要將 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 權杖

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

啟動模擬器

您可以透過 Emulator Suite UI 以互動方式使用 Authentication 模擬器,也可以透過本機 REST 介面以非互動方式使用。以下各節將介紹互動式和非互動式用途。

如要啟動 Authentication 模擬器、其 REST 介面和 Emulator Suite UI,請執行:

firebase emulators:start

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

如要進行電子郵件/密碼驗證,您可以開始設計原型,方法是使用 Authentication SDK 方法,從應用程式將使用者帳戶新增至 Authentication 模擬器,或使用 Emulator Suite UI。

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

建立測試使用者後,應用程式就能使用平台 (iOS、Android、網頁) 的 SDK 邏輯,讓使用者登入及登出。

如要測試電子郵件驗證/使用電子郵件連結流程登入,模擬器會將網址輸出至執行 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,建立及刪除使用者帳戶,並擷取頻外電子郵件驗證碼,填入模擬器電子郵件驗證網址,而不必使用 Emulator Suite UI 或用戶端程式碼管理電子郵件/密碼使用者帳戶。這樣可以區隔平台和測試程式碼,並以非互動方式進行測試。

對於非互動式電子郵件和密碼測試流程,一般順序如下。

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

模擬電話/簡訊驗證

Auth 模擬器不支援下列電話驗證功能:

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

除此之外,就用戶端程式碼而言,電話/簡訊驗證流程與正式環境所述流程相同 (iOS、Android、網頁)。

使用 Emulator Suite UI:

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

不過,在電話驗證流程中,模擬器不會觸發任何簡訊傳送,因為與電信業者聯絡不在範圍內,也不適合本機測試!模擬器會將原本要透過簡訊傳送的驗證碼,輸出到您執行 firebase emulators:start 的終端機。請將這組驗證碼輸入應用程式,模擬使用者查看簡訊的情境。

非互動式測試

如要進行非互動式電話驗證測試,請使用 Authentication 模擬器 REST API 擷取可用的簡訊驗證碼。請注意,每次啟動流程時,代碼都會不同。

一般順序如下。

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

簡訊多重驗證

Authentication 模擬器支援原型設計和測試,可用於測試 iOS、Android 和網頁正式環境中的簡訊多重驗證 (MFA) 流程。

在模擬器中新增模擬使用者時,您可以啟用多重驗證,並設定一或多組電話號碼,用於接收第二驗證要素簡訊。訊息會輸出至您執行 firebase emulators:start 的同一個終端機,並可透過 REST 介面取得。

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

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

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

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

再次提醒,請查看上方的說明文件連結,並確認您熟悉要使用的流程 (Firebase SDK 管理或手動擷取憑證)。Authentication 模擬器支援測試這兩種方法。

測試 Firebase SDK 驅動的 IDP 流程

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

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

手動擷取憑證,測試 IDP 流程

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

請注意,模擬器僅支援 signInWithCredential 驗證,適用於從 Google 登入、Apple 和其他使用 JSON Web Token (JWT) 實作 ID 權杖的供應商擷取的憑證。不支援存取權杖 (例如 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)。您可以將 sub 欄位視為主鍵,並變更為任何字串,模擬不同使用者登入。您可以將 firebase.auth.GoogleAuthProvider 替換為 new firebase.auth.OAuthProvider('yahoo.com') 或任何其他要模擬的供應商 ID。

模擬自訂權杖驗證

Authentication 模擬器會使用自訂 JSON Web Token 處理驗證,方法是在支援的平台上呼叫 signInWithCustomToken 方法,如正式版 Authentication 說明文件所述。

Authentication 模擬器與正式環境的差異

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

Cloud IAM

Firebase 模擬器套件不會嘗試複製或遵循任何與 IAM 相關的執行行為。模擬器會遵循提供的 Firebase 安全性規則,但在通常會使用 IAM 的情況下 (例如設定 Cloud Functions 叫用服務帳戶,進而設定權限),模擬器無法設定,並會使用開發機器上的全域可用帳戶,類似於直接執行本機指令碼。

在行動平台上,電子郵件連結登入功能仰賴 Firebase Dynamic Links,因此所有這類連結都會改為在 (行動) 網頁平台上開啟。

第三方登入

如果是第三方登入流程,Firebase Authentication 會仰賴 Twitter 和 GitHub 等第三方供應商提供的安全憑證。

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

電子郵件/簡訊登入

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

模擬器不支援使用固定登入代碼定義測試電話號碼的功能,而 Firebase 控制台則可執行這項操作。

自訂權杖驗證

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

頻率限制/反濫用

Authentication 模擬器不會複製正式環境的頻率限制或防範濫用功能。

封鎖函式

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

後續步驟