Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

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

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

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

選擇一個 Firebase 項目

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

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

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

項目類型特徵與模擬器一起使用
真實的

一個真正的 Firebase 項目是您創建和配置的(很可能通過 Firebase 控制台)。

真實項目具有實時資源,例如數據庫實例、存儲桶、函數或您為該 Firebase 項目設置的任何其他資源。

在處理真實的 Firebase 項目時,您可以為任何或所有受支持的產品運行模擬器。

因為你不模仿任何產品,您的應用程序和代碼將用資源(數據庫實例,存儲鬥,功能等)進行交互。

演示

一個演示火力地堡項目有沒有真正的火力地堡配置和沒有活的資源。這些項目通常通過代碼實驗室或其他教程訪問。

項目編號為示範項目有demo-前綴。

當演示火力地堡的項目,你的應用程序和用仿真器代碼交互工作。如果您的應用嘗試與模擬器未運行的資源進行交互,則該代碼將失敗。

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

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

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

Android、iOS 和 Web SDK

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

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

網頁版 9

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

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

網頁版 8

const auth = firebase.auth();
auth.useEmulator("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。

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

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

雲端 IAM

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

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

第三方登錄

對於第三方登錄流程,Firebase 身份驗證依賴於來自第三方提供商(如 Twitter 和 Github)的安全憑據。

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

電子郵件/短信登錄

在生產應用程序中,電子郵件和 SMS 登錄流涉及異步操作,在該操作中,用戶檢查收到的消息並將登錄代碼輸入登錄界面。驗證仿真器不發送任何電子郵件或SMS消息,但如所描述的以上,但它產生的登錄碼,並將它們輸出到終端在測試中使用。

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

限速/反濫用

身份驗證模擬器不會復制生產速率限製或反濫用功能。

接下來是什麼?