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

在應用程式中使用 Authentication 模擬器前,請先確認 您瞭解整體 Firebase Local Emulator Suite 工作流程。 而且您需要安裝及設定 Local Emulator Suite 並查看其 CLI 指令

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

Authentication 模擬器提供哪些功能?

Authentication 模擬器提供高精確度的本機模擬功能, Firebase Authentication 服務,提供在 正式版 Firebase Authentication。與 Apple 平台配對 Android 和 Web Firebase SDK 的模擬器可讓您:

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

選擇 Firebase 專案

Firebase Local Emulator Suite 在單一 Firebase 專案中模擬產品。

如要選取要使用的專案,請先在 CLI 執行下列指令,再啟動模擬器 firebase use。您也可以 對每個模擬器使用 --project 標記 指令

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

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

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

真實專案具備即時資源,例如資料庫執行個體、儲存空間 您為此 Firebase 設定的值區、函式或任何其他資源 專案。

使用實際的 Firebase 專案時 或所有支援的產品

如有任何產品並非由您模擬,應用程式和程式碼就會 會與 live 資源 (資料庫執行個體、儲存空間) 互動 值區、函式等)。

示範

示範 Firebase 專案沒有實際的 Firebase 設定, 沒有即時資源這類專案通常透過程式碼研究室或 其他教學課程

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

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

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

  • 設定更簡單,因為您無須建立 Firebase 專案
  • 提升安全性,因為程式碼意外叫用非模擬 (實際工作環境) 資源,則任何資料都無法變更、用量和計費
  • 更完善的離線支援功能,因為不必上網也可以 下載 SDK 設定。
,瞭解如何調查及移除這項存取權。

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

Android、iOS 和網頁 SDK

設定應用程式內設定或測試類別,以便與 Authentication 模擬器,如下所示。

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");

不需要額外設定,就能針對和測試兩者之間的互動進行原型設計和測試 AuthenticationCloud FunctionsFirebase Security Rules (Cloud FirestoreRealtime Database。設定 Authentication 模擬器和其他模擬器時 因此它們會自動搭配運作

Admin SDK

在以下情況下,Firebase Admin SDK 會自動連線至 Authentication 模擬器 FIREBASE_AUTH_EMULATOR_HOST 環境變數已設定,

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

請注意,Cloud Functions 模擬器會自動得知 Authentication 模擬器,以便在測試間的整合時略過這個步驟 Cloud FunctionsAuthentication 模擬器。環境變數將 自動為 Cloud Functions 中的 Admin SDK 設定。

設定環境變數後,Firebase Admin SDK 就會接受未簽署的 ID Authentication 模擬器核發的權杖和工作階段 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

對於匿名驗證,應用程式可對應用程式執行登入邏輯 平台 (iOSAndroid網站)。

針對電子郵件/密碼驗證,您可以開始設計原型,方法是 透過 Authentication SDK 方法從您的應用程式存取使用者帳戶至 Authentication 模擬器, 或是使用 Emulator Suite UI

  1. Emulator Suite 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

非互動式測試

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

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

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

模擬電話/簡訊驗證

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

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

至於用戶端代碼方面,電話/SMS 驗證流程 與正式版相同 (iOSAndroid網頁)。

使用 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 模擬器支援原型設計及測試簡訊多重要素 iOSAndroid網頁

將模擬使用者新增至模擬器後,即可啟用 MFA 並加以設定 用於傳送雙重驗證簡訊的電話號碼。訊息 都是輸出至你執行 firebase emulators:start 的同一個終端機, 而且可從 REST 介面取得

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

您可以利用 Authentication 模擬器,在 iOS、Android 或網頁應用程式。範例說明 驗證流程,請參閱相關說明文件 在應用程式中使用的供應商和平台組合

一般而言,使用 Firebase SDK 就能一次完成 有兩種方法

  • 應用程式允許 SDK 端對端處理整個程序,包括: 與第三方 IdP 供應商之間的所有互動,以便擷取憑證。
  • 您的應用程式會使用該程式碼,手動從第三方供應商擷取憑證 然後將這些憑證傳遞至 Authentication SDK。

請再次查看上方的說明文件連結,確認您充分瞭解 選擇流程 - 由 Firebase SDK 管理或手動擷取憑證,您想要的 。Authentication 模擬器支援這兩種方法的測試。

測試 Firebase SDK 導向的 IDP 流程

應用程式使用任何 Firebase SDK 端對端流程,例如:OAuthProvider 登入 Microsoft、GitHub 或 Yahoo,以便進行互動式測試。Authentication 模擬器提供對應的登入頁面本機版本,可協助您 從呼叫 signinWithPopup 的網頁應用程式中,測試驗證。 signInWithRedirect 方法。這個本機提供的登入頁面也會顯示 產生的內容。

模擬器會視需要建立模擬第三方使用者帳戶和憑證 繼續製作

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

如果您使用「手動」登入技術,並呼叫您平台的 signInWithCredentials 方法,那麼您的應用程式就會像往常一樣要求第三方登入, 擷取真實的第三方憑證

請注意,模擬器僅支援 signInWithCredential 驗證 擷取自 Google 登入、Apple 及其他供應商 使用以 JSON Web Token (JWT) 形式實作的 ID 權杖。存取權杖 (由 Facebook 或 Twitter 提供,但並非 JWT) 。下一節將討論這種情況的替代方案。

非互動式測試

非互動式測試的其中一種方法是自動在使用者登入時, 透過模擬器提供的網頁。如果是網頁應用程式,請使用控制介面,例如 WebDriver。針對行動裝置,請使用平台 (例如 Espresso) 的 UI 測試工具 或 Xcode

或者,您也可以更新程式碼,改用 signInWithCredential (例如在程式碼分支版本中) 搭配模擬使用權杖驗證流程 這類 ID 權杖而非實際憑證。

  1. 重新連接或註解到程式碼中擷取 idToken 的部分 IdP如此一來,您就不需在 測試,並將 IDP 的 API 配額和頻率限制解除測試。
  2. 接著,使用常值 JSON 字串取代 signInWithCredential。以 Web 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 可模擬

模擬自訂權杖驗證

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 等第三方供應商

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

電子郵件 / 簡訊登入

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

模擬器不支援定義測試用電話號碼的功能, 已修復登入代碼,就像使用 Firebase 控制台一樣。

自訂權杖驗證

Authentication 模擬器不會驗證自訂的簽名或到期日 符記這樣您就能使用手動建立的符記並重複使用符記 在原型設計和測試情境中無限期執行。

頻率限制 / 反濫用

Authentication 模擬器不會複製實際工作環境頻率限製或反濫用功能 接著介紹網際網路通訊層 包括兩項主要的安全防護功能

封鎖函式

在實際工作環境中,在 beforeCreate 後,使用者會寫入儲存空間一次 會觸發 beforeSignIn 個事件但礙於技術限制 Authentication 模擬器會在使用者建立後寫入儲存兩次 登入另一個帳戶也就是說,新使用者 Authentication 模擬器的 beforeSignIn 中使用 getAuth().getUser(),但您將 在實際工作環境中執行時發生錯誤。

接下來呢?