將您的應用程式連接到身份驗證模擬器

在將身份驗證模擬器與您的應用程式結合使用之前,請確保您了解 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 專案時,您的應用程式和程式碼與模擬器互動。如果您的應用程式嘗試與未運行模擬器的資源進行交互,則該程式碼將會失敗。

我們建議您盡可能使用演示項目。好處包括:

  • 設定更簡單,因為您無需建立 Firebase 專案即可運行模擬器
  • 更強的安全性,因為如果您的程式碼意外調用非模擬(生產)資源,則不會發生資料變更、使用和計費
  • 更好的離線支持,因為無需訪問互聯網即可下載 SDK 配置。

檢測您的應用程式以與模擬器對話

Android、iOS 和 Web SDK

設定應用程式內配置或測試類別以與身份驗證模擬器交互,如下所示。

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

Web modular API

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

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

Web namespaced API

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 管理 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

對於匿名身份驗證,您的應用程式可以針對您的平台( iOSAndroidWeb )執行登入邏輯。

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

  1. 在模擬器套件 UI 中,按一下「身份驗證」標籤。
  2. 點選新增用戶按鈕。
  3. 依照使用者帳戶建立精靈操作,填寫電子郵件驗證欄位。

建立測試使用者後,您的應用程式可以使用適用於您的平台( iOSAndroidWeb )的 SDK 邏輯讓使用者登入和登出。

為了使用電子郵件連結流測試電子郵件驗證/登錄,模擬器會將 URL 列印到執行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"
  }
}

為了測試密碼重置,模擬器會向終端列印一個類似的 URL,包括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. 使用身份驗證註冊 REST 端點建立使用者。
  2. 使用電子郵件和密碼登入使用者以執行測試。
  3. 如果適用於您的測試,請從模擬器特定的 REST 端點取得可用的帶外電子郵件驗證碼。
  4. 使用模擬器特定的 REST 端點刷新使用者記錄以清除資料。

類比電話/簡訊驗證

對於電話身份驗證,Auth 模擬器不支援:

  • reCAPTCHA 和 APN 流程。配置為與模擬器互動後,用戶端 SDK 會以類似於整合測試( iOSAndroidweb )所述的方式停用這些驗證方法。
  • 使用 Firebase 控制台中預先配置的程式碼測試電話號碼。

否則,就客戶端程式碼而言,電話/簡訊驗證流程與生產( iOSAndroidWeb )中所述的流程相同。

使用模擬器套件 UI:

  1. 在模擬器套件 UI 中,按一下「身份驗證」標籤。
  2. 點選新增用戶按鈕。
  3. 依照使用者帳戶建立精靈操作,填寫電話身份驗證欄位。

但是,對於電話身份驗證流程,模擬器不會觸發任何簡訊的發送,因為聯繫運營商超出了範圍,並且不適合本地測試!相反,模擬器會列印出透過簡訊傳送到執行firebase emulators:start的相同終端的程式碼;將此程式碼輸入到應用程式中以模擬使用者檢查簡訊。

非互動式測試

對於非互動式電話驗證測試,請使用驗證模擬器 REST API 擷取可用的 SMS 程式碼。請注意,每次啟動流程時,程式碼都是不同的。

典型的順序如下。

  1. 呼叫平台signInWithPhoneNumber開始驗證過程。
  2. 使用模擬器特定的 REST 端點檢索驗證碼。
  3. 像往常一樣使用驗證碼呼叫confirmationResult.confirm(code)

多因素簡訊

身份驗證模擬器支援對iOSAndroidWeb生產中可用的 SMS 多重身份驗證 (MFA) 流程進行原型設計和測試。

當您將類比使用者新增至模擬器時,您可以啟用 MFA 並配置將向其發送第二因素 SMS 訊息的一個或多個電話號碼。訊息輸出到執行firebase emulators:start的相同終端,並可從 REST 介面取得。

模擬第三方身分提供者 (IDP) 身份驗證

身份驗證模擬器可讓您在 iOS、Android 或 Web 應用程式中測試許多第三方身份驗證流程,而無需對生產程式碼進行任何變更。有關身份驗證流程的範例,請參閱有關可在應用程式中使用的各種提供者和平台組合的文件。

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

  • 您的應用程式允許 SDK 端對端處理整個流程,包括與第三方 IDP 提供者檢索憑證的所有互動。
  • 您的應用程式使用第三方提供者的 SDK 手動檢索憑證,並將這些憑證傳遞給身份驗證 SDK。

再次檢查上面的文檔鏈接,並確保您熟悉您想要使用的流程 - Firebase SDK 管理與手動憑證檢索。身份驗證模擬器支援這兩種方法的測試。

測試 Firebase SDK 驅動的 IDP 流

如果您的應用程式使用任何 Firebase SDK 端對端流程(例如使用OAuthProvider登入 Microsoft、GitHub 或 Yahoo)進行互動式測試,則驗證模擬器會提供相應登入頁面的本機版本來協助您進行測試來自呼叫signinWithPopupsignInWithRedirect方法的Web 應用程式的身份驗證。此本機服務的登入頁面也會出現在行動應用程式中,由平台的 webview 庫呈現。

隨著流程的進行,模擬器會根據需要建立模擬第三方使用者帳戶和憑證。

透過手動憑證檢索測試 IDP 流

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

請注意,模擬器僅支援對從 Google Sign-In、Apple 和其他使用作為 JSON Web 令牌 (JWT) 實現的 ID 令牌的提供者檢索的憑證進行signInWithCredential身份驗證。不支援存取令牌(例如 Facebook 或 Twitter 提供的令牌,它們不是 JWT)。下一節將討論這些情況下的替代方案。

非互動式測試

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

或者,您可以更新程式碼以使用signInWithCredential (例如在程式碼分支中),並使用令牌驗證流程和帳戶的模擬ID 令牌而不是真實憑證。

  1. 重新連線或註解掉從 IDP 檢索 idToken 的程式碼部分;這樣您就無需在測試期間輸入真實的使用者名稱和密碼,並且可以使您的測試免受 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。

模擬自訂令牌身份驗證

身份驗證模擬器使用自訂 JSON Web 令牌在受支援的平台上呼叫signInWithCustomToken方法來處理身份驗證,如生產身份驗證文件中所述。

身份驗證模擬器與生產環境有何不同

Firebase 身份驗證模擬器模擬生產產品的許多功能。然而,由於任何類型的身份驗證系統都嚴重依賴多個層級(設備、第三方提供者、Firebase 等)的安全性,因此模擬器很難正確地重新建立所有流。

雲端身分管理

Firebase 模擬器套件不會嘗試複製或遵守任何與 IAM 相關的運行行為。模擬器遵守提供的 Firebase 安全性規則,但在通常使用 IAM 的情況下,例如設定呼叫服務帳戶和權限的 Cloud Functions,模擬器不可配置,並將使用開發人員電腦上的全域可用帳戶,類似於直接執行本地腳本。

由於在行動平台上,電子郵件鏈接登入依賴 Firebase 動態鏈接,因此所有此類鏈接都將在(移動)網絡平台上打開。

第三方登入

對於第三方登入流程,Firebase 驗證依賴 Twitter 和 Github 等第三方提供者的安全憑證。

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

電子郵件/簡訊登入

在生產應用程式中,電子郵件和簡訊登入流程涉及非同步操作,其中使用者檢查收到的訊息並將登入代碼輸入登入介面。身份驗證模擬器不會發送任何電子郵件或短信,但如上所述,它會生成登入代碼並將其輸出到終端以用於測試。

模擬器不支援使用 Firebase 控制台定義具有固定登入代碼的測試電話號碼的功能。

自訂令牌認證

身份驗證模擬器不會驗證自訂令牌的簽署或到期時間。這允許您在原型設計和測試場景中使用手工製作的令牌並無限期地重複使用令牌。

速率限制/反濫用

身份驗證模擬器不會複製生產力限製或反濫用功能。

阻塞功能

在生產中,在觸發beforeCreatebeforeSignIn事件後,使用者將被寫入儲存一次。但是,由於技術限制,身份驗證模擬器會寫入儲存兩次,一次在使用者建立後,另一次在登入後。這意味著對於新用戶,您可以在身份驗證模擬器的beforeSignIn中成功調用getAuth().getUser() ,但在生產中這樣做會遇到錯誤。

接下來是什麼?