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

使用驗證仿真器與您的應用程序之前,請確保您了解整體火力地堡本地模擬器套房的工作流程,以及您安裝並配置本地仿真器套件和審查其CLI命令

我可以用身份驗證模擬器做什麼?

身份驗證仿真器提供的火力地堡認證服務高保真本地仿真,提供多中找到的功能,生產火力地堡認證。與 iOS、Android 和 Web Firebase SDK 搭配使用,模擬器可讓您:

  • 創建、更新和管理模擬用戶帳戶,以測試電子郵件/密碼、電話號碼/短信以及使用第三方身份提供商(例如 Google)登錄
  • 查看和編輯模擬用戶
  • 在 Emulator UI Logs 選項卡中檢查與身份驗證相關的消息。

選擇一個 Firebase 項目

Firebase 本地模擬器套件模擬單個 Firebase 項目的產品。

要選擇項目中使用,啟動模擬器前,在命令行運行firebase use在你的工作目錄。或者,您可以通過--project標誌給每個仿真命令。

當地仿真器套件支持實時火力地堡項目和示範項目的仿真。

項目類型特徵與模擬器一起使用
真實的真正的項目是您在 Firebase 控制台中配置和激活的項目;真正的項目具有實時資源,例如數據庫、存儲桶、函數或您為該項目設置的任何其他資源。在處理實際項目時,您可以為項目中的任何或所有支持的產品運行模擬器。

對於任何產品你不模仿,你的應用程序和代碼將與活動數據庫,存儲桶,功能等互動
演示演示項目沒有 Firebase 控制台配置,也沒有實時資源。

演示項目標識具有demo-前綴。
使用演示項目時,您的應用程序和代碼僅與模擬器交互。如果您的應用程序與模擬器未運行的資源進行交互,則該代碼將失敗。

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

  • 設置更簡單,因為您無需創建 Firebase 項目即可運行模擬器
  • 更強的安全性,因為如果您的代碼不小心調用了非模擬(生產)資源,則不會發生數據更改、使用和計費
  • 更好的離線支持,因為無需訪問互聯網即可下載您的 SDK 配置。

檢測您的應用程序以與身份驗證模擬器對話

Android、iOS 和網絡 SDK

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

安卓
FirebaseAuth.getInstance().useEmulator('10.0.2.2', 9099);
iOS - 斯威夫特
Auth.auth().useEmulator(withHost:"localhost", port:9099)

網頁版 v8

var auth = firebase.auth();
auth.useEmulator("http://localhost:9099");

網頁版 v9

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

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

無需額外設置即可對身份驗證與 Cloud Functions 或 Cloud Firestore 或實時數據庫的 Firebase 安全規則之間的交互進行原型設計和測試。當配置了身份驗證模擬器並且其他模擬器正在運行時,它們會自動協同工作。

管理 SDK

當在火力地堡管理員SDK會自動連接到認證模擬器FIREBASE_AUTH_EMULATOR_HOST環境變量設置。

export FIREBASE_AUTH_EMULATOR_HOST="localhost:9099"

請注意,Cloud Functions 模擬器會自動識別身份驗證模擬器,因此您可以在測試 Cloud Functions 和身份驗證模擬器之間的集成時跳過此步驟。將自動為 Cloud Functions 中的 Admin SDK 設置環境變量。

隨著環境變量設置,管理員火力地堡的軟件開發工具包將接受(通過由認證模擬器發出的無符號ID令牌和會話cookie verifyIdTokencreateSessionCookie分別方法),以促進地方developmemt和測試。請務必不要設置在生產中的環境變量。

連接到身份驗證模擬器時,您需要指定項目 ID。你可以通過一個項目ID來initializeApp直接或設置GCLOUD_PROJECT環境變量。請注意,您不需要使用真實的 Firebase 項目 ID;身份驗證模擬器將接受任何項目 ID。

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

身份令牌

出於安全原因,所述身份驗證仿真問題無符號ID令牌,其僅由其他火力地堡仿真器所接受,或火力地堡管理員SDK時配置。這些令牌將被在生產模式下運行的生產 Firebase 服務或 Firebase Admin SDK 拒絕(例如,沒有上述設置步驟的默認行為)。

要開始使用身份驗證模擬器和模擬器套件 UI 進行交互式原型設計,請啟動 Firebase 本地模擬器套件。

firebase emulators:start

對於匿名身份驗證,應用程序可以鍛煉登錄邏輯平台( iOS版Android版網絡)。

對於電子郵件/密碼驗證,就可以開始使用認證SDK方法,從您的應用程序將用戶帳戶添加到驗證仿真器或通過使用模擬器套房UI原型。

  1. 在模擬器套房UI中,單擊身份驗證選項卡。
  2. 點擊添加用戶按鈕。
  3. 按照用戶帳戶創建嚮導,填寫電子郵件身份驗證字段。

隨著測試用戶創建的,您的應用程序可以登錄和退出與SDK邏輯平台(用戶的iOS安卓網絡)。

為了測試電子郵件驗證/登錄與電子郵件鏈接流動時,仿真器輸出一個URL到使終端firebase emulators:start被執行。

i  To verify the email address customer@ex.com, follow this link:
http://localhost: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://localhost:9099/emulator/action?mode=resetPassword&oobCode=XYZ!23&apiKey=fake-api-key&newPassword=YOUR_NEW_PASSWORD

非交互式測試

您可以編寫測試設置腳本,調用 REST API 來創建和刪除用戶帳戶並獲取帶外電子郵件驗證碼以填充模擬器電子郵件驗證,而不是使用 Emulator Suite UI 或客戶端代碼來管理電子郵件/密碼用戶帳戶網址。這將平台和測試代碼分開,讓您以非交互方式進行測試。

對於非交互式電子郵件和密碼測試流程,典型序列如下。

  1. 創建具有認證用戶註冊REST端點
  2. 使用電子郵件和密碼登錄用戶以執行測試。
  3. 如果適用於您的測試,取從可用出帶外的電子郵件驗證碼模擬器專用的REST endpont
  4. 同花順用戶記錄與模擬器專用的REST端點用的數據。

模擬電話/短信認證

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

  • reCAPTCHA 和 APN 流程。一旦配置進行互動與仿真器,客戶端軟件開發工具包以類似的集成測試(描述的方式禁用這些驗證方法的iOS安卓網絡)。
  • 使用 Firebase 控制台中預配置的代碼測試電話號碼。

否則,在客戶端代碼而言,電話/ SMS認證流程是相同的,用於產生(描述的iOSAndroid的網絡)。

使用模擬器套件 UI:

  1. 在模擬器套房UI中,單擊身份驗證選項卡。
  2. 點擊添加用戶按鈕。
  3. 按照用戶帳戶創建嚮導,填寫電話身份驗證字段。

但是,對於電話身份驗證流程,模擬器不會觸發任何文本消息的傳遞,因為聯繫運營商不在範圍內並且對本地測試不友好!取而代之的是,仿真器打印出的是將已通過短信發送到您運行相同的終端代碼firebase emulators:start ;將此代碼輸入應用程序以模擬用戶查看他們的短信。

非交互式測試

對於非交互式電話身份驗證測試,請使用身份驗證模擬器 REST API 來檢索可用的 SMS 代碼。請注意,每次啟動流程時代碼都不同。

典型的順序如下。

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

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

身份驗證模擬器可讓您在 iOS、Android 或 Web 應用程序中測試許多第三方身份驗證流程,而無需更改生產代碼。對於認證流程的例子,請查閱各種文件提供商和平台,你可以在你的應用程序中使用的組合

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

  • 您的應用程序讓 SDK 處理端到端的整個過程,包括與第三方 IDP 提供商的所有交互以檢索憑據。
  • 您的應用程序使用第三方提供商的 SDK 從第三方提供商那里手動檢索憑據,並將這些憑據傳遞給身份驗證 SDK。

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

測試 Firebase SDK 驅動的 IDP 流

如果應用程序使用任何火力地堡SDK終端到終端的流量,如OAuthProvider在登錄微軟,GitHub上,或雅虎,交互式測試,驗證仿真器提供相應的登錄頁面的本地版本來幫助你測試從Web認證應用包含的通話signinWithPopupsignInWithRedirect方法。這個本地提供的登錄頁面也出現在移動應用程序中,由您平台的 webview 庫呈現。

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

使用手動憑證檢索測試 IDP 流

如果使用“手動”登錄技術和呼叫平台的signInWithCredentials方法,那麼,像往常一樣,您的應用程序會要求真正的第三方登錄和檢索實時第三方憑據。

請注意,模擬器只支持signInWithCredential對於使用ID令牌實現為JSON網絡令牌(JWTs)從谷歌帳戶登錄,蘋果,和其他供應商獲取的證書認證。不支持訪問令牌(例如,由 Facebook 或 Twitter 提供的不是 JWT 的令牌)。下一節將討論這些情況下的替代方案。

非交互式測試

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

或者,您可以更新您的代碼以使用signInWithCredential (例如,在代碼分支),並使用與模擬ID令牌的令牌認證流程的賬戶,而不是真正的憑據。

  1. 重新連接或註釋掉從 IDP 檢索 idTokens 的代碼部分;這消除了在您的測試期間輸入真實用戶名和密碼的需要,並使您的測試免於在 IDP 的 API 配額和速率限制。
  2. 其次,在地方令牌的使用文字JSON字符串signInWithCredential 。以 web SDK 為例,您可以將代碼更改為:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

當仿真器使用,這個代碼將成功地驗證與電子郵件用戶foo@example.com在谷歌。將子字段視為主鍵,可以更改為任何字符串,模擬不同用戶的簽名。您可以替換firebase.auth.GoogleAuthProvider用,例如, new firebase.auth.OAuthProvider('yahoo.com')或者你想嘲笑任何其他供應商ID。

接下來是什麼?