使用 Authentication 模擬器測試應用程式前,請務必瞭解整體 Firebase Local Emulator Suite 工作流程,並安裝及設定 Local Emulator Suite,然後查看其 CLI 指令。
本主題假設您已熟悉如何開發Firebase Authentication解決方案,並用於正式環境。如有需要,請參閱平台和驗證技術組合的說明文件。
Authentication模擬器有什麼用途?
Authentication 模擬器可提供 Firebase Authentication 服務的高擬真度本機模擬功能,並提供正式版 Firebase Authentication 的大部分功能。搭配 Apple 平台、Android 和 Web Firebase SDK,模擬器可讓您:
- 建立、更新及管理模擬使用者帳戶,以便測試電子郵件/密碼、電話號碼/簡訊、簡訊多重驗證,以及第三方 (例如 Google) 識別資訊提供者驗證
- 查看及編輯模擬使用者
- 原型自訂權杖驗證系統
- 在模擬器使用者介面的「記錄」分頁中,查看與驗證相關的訊息。
選擇 Firebase 專案
Firebase Local Emulator Suite 會模擬單一 Firebase 專案的產品。
如要選取要使用的專案,請先啟動模擬器,然後在工作目錄中執行 firebase use
。或者,您也可以將 --project
標記傳遞至每個模擬器指令。
Local Emulator Suite 支援模擬實際 Firebase 專案和示範專案。
專案類型 | 功能 | 搭配模擬器使用 |
---|---|---|
Real |
您建立及設定的 Firebase 專案 (很可能透過 Firebase 控制台) 才是實際專案。 實際專案具有即時資源,例如資料庫執行個體、儲存空間值區、函式,或是您為該 Firebase 專案設定的任何其他資源。 |
使用實際的 Firebase 專案時,您可以為任何或所有支援的產品執行模擬器。 對於您未模擬的任何產品,應用程式和程式碼都會與實際資源 (資料庫執行個體、儲存空間 bucket、函式等) 互動。 |
示範 |
示範 Firebase 專案沒有實際 Firebase 設定,也沒有即時資源。這些專案通常透過程式碼研究室或其他教學課程存取。 示範專案的專案 ID 前置字串為 |
使用 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)
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 SDKs 會接受 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,開始製作原型。
- 在 Emulator Suite UI 中,按一下「驗證」分頁標籤。
- 按一下「新增使用者」按鈕。
- 按照使用者帳戶建立精靈的指示,填寫電子郵件驗證欄位。
建立測試使用者後,應用程式就能透過適用於您平台的 SDK 邏輯登入及登出使用者 (iOS、Android、網頁)。
如要測試電子郵件驗證/透過電子郵件連結登入流程,模擬器會在執行 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 來建立及刪除使用者帳戶,並擷取頻外電子郵件驗證碼,填入模擬器電子郵件驗證網址。這樣一來,平台和測試程式碼就會分開,您也可以非互動式地進行測試。
對於非互動式電子郵件地址和密碼測試流程,一般順序如下。
- 使用 Authentication signUp REST 端點建立使用者。
- 使用電子郵件地址和密碼登入使用者,進行測試。
- 如果測試需要,請從模擬器專屬的 REST 端點擷取可用的頻外電子郵件驗證碼。
- 使用模擬器專屬的 REST 端點清除資料,即可清除使用者記錄。
模擬電話/簡訊驗證
如果是手機驗證,Auth 模擬器不支援:
- reCAPTCHA 和 APN 流程。設定與模擬器互動後,用戶端 SDK 會停用這些驗證方法,方式與整合測試所述類似 (iOS、Android、網頁)。
- 使用在 Firebase 控制台中預先設定的代碼測試電話號碼。
否則,就用戶端程式碼而言,電話/簡訊驗證流程與正式版所述流程相同 (iOS、Android、網頁版)。
使用 Emulator Suite UI:
- 在 Emulator Suite UI 中,按一下「驗證」分頁標籤。
- 按一下「新增使用者」按鈕。
- 按照使用者帳戶建立精靈的指示,填寫電話驗證欄位。
不過,如果是手機驗證流程,模擬器「不會」觸發任何簡訊傳送作業,因為聯絡電信業者超出範圍,且不適合進行本機測試!模擬器會改為列印本應透過簡訊傳送至您執行 firebase emulators:start
的相同終端機的驗證碼;請將這個驗證碼輸入應用程式,模擬使用者查看簡訊。
非互動式測試
如要測試非互動式手機驗證,請使用 Authentication模擬器 REST API 擷取可用的簡訊代碼。請注意,每次啟動流程時,系統都會提供不同的代碼。
一般順序如下。
- 呼叫平台
signInWithPhoneNumber
啟動驗證程序。 - 使用模擬器專屬的 REST 端點擷取驗證碼。
- 使用驗證碼照常撥打
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 登入),模擬器會提供對應登入頁面的本機版本,方便您測試從呼叫 signinWithPopup
或 signInWithRedirect
方法的網頁應用程式進行驗證。OAuthProvider
Authentication這個在本機提供的登入頁面也會顯示在行動應用程式中,並由平台的 WebView 程式庫轉譯。
模擬器會在流程進行期間,視需要建立模擬的第三方使用者帳戶和憑證。
透過手動擷取憑證測試 IDP 流程
如果您使用「手動」登入技術並呼叫平台的 signInWithCredentials
方法,應用程式會照常要求進行第三方登入,並擷取第三方憑證。
請注意,模擬器僅支援signInWithCredential
驗證,適用於從 Google 登入、Apple 和其他供應商擷取的憑證,這些供應商使用以 JSON Web Token (JWT) 實作的 ID 權杖。系統不支援存取權杖 (例如 Facebook 或 Twitter 提供的權杖,這類權杖並非 JWT)。下一節將討論這些情況的替代方案。
非互動式測試
非互動式測試的方法之一,是自動點選模擬器提供的登入頁面。如果是網頁應用程式,請使用 WebDriver 等控制介面。如果是行動裝置,請使用平台提供的 UI 測試工具,例如 Espresso 或 Xcode。
或者,您也可以更新程式碼以使用 signInWithCredential
(例如在程式碼分支中),並使用權杖驗證流程搭配帳戶的模擬 ID 權杖,而非實際憑證。
- 重新連線或註解掉從 IDP 擷取 idToken 的程式碼部分;這樣一來,您在測試期間就不需要輸入真實的使用者名稱和密碼,測試也不會受到 IDP 的 API 配額和速率限制影響。
- 其次,請使用 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 說明文件所述,Authentication 模擬器會使用支援平台上的 signInWithCustomToken
方法呼叫,處理自訂 JSON Web Token 的驗證。
Authentication模擬器與正式版有何不同
Firebase Authentication 模擬器可模擬許多正式版產品的功能。不過,由於任何驗證系統都非常依賴多個層級 (裝置、第三方供應商、Firebase 等) 的安全性,因此模擬器很難正確重現所有流程。
Cloud IAM
Firebase 模擬器套件不會嘗試複製或遵守任何 IAM 相關的執行行為。模擬器會遵守提供的 Firebase 安全性規則,但在通常會使用 IAM 的情況下 (例如設定 Cloud Functions 叫用服務帳戶,進而設定權限),模擬器無法設定,會使用開發人員電腦上全域可用的帳戶,類似於直接執行本機指令碼。
透過行動裝置上的電子郵件連結登入
由於在行動平台,電子郵件連結登入功能依賴 Firebase 動態連結,因此這類連結一律會在 (行動) 網頁平台開啟。
第三方登入
如果是第三方登入流程,Firebase Authentication 會依據 Twitter 和 GitHub 等第三方供應商提供的安全憑證。
Authentication 模擬器會接受來自 OpenID Connect 提供者 (例如 Google 和 Apple) 的實際憑證。系統不支援非 OpenID Connect 提供者的憑證。
透過電子郵件 / 簡訊登入
在正式版應用程式中,電子郵件和簡訊登入流程會涉及非同步作業,使用者會檢查收到的訊息,並在登入介面中輸入登入代碼。Authentication 模擬器不會傳送任何電子郵件或簡訊,但如上所述,模擬器會產生登入代碼並輸出至終端機,以供測試使用。
模擬器不支援定義具有固定登入碼的測試電話號碼,這點與 Firebase 控制台不同。
自訂權杖驗證
Authentication模擬器不會驗證自訂權杖的簽章或效期。這樣您就能在原型設計和測試情境中,使用手動建立的權杖,並無限期重複使用權杖。
頻率限制 / 反濫用
Authentication 模擬器不會複製正式版中的速率限制或防濫用功能。
封鎖函式
在正式環境中,系統會在觸發 beforeCreate
和 beforeSignIn
事件後,將使用者寫入儲存空間一次。不過,由於技術限制,Authentication模擬器會寫入儲存空間兩次,一次是在建立使用者後,另一次是在登入後。也就是說,對於新使用者,您可以在 Authentication 模擬器中成功呼叫 beforeSignIn
中的 getAuth().getUser()
,但在實際運作時會遇到錯誤。
後續步驟
如需一系列精選影片和詳細使用說明範例,請觀看 Firebase 模擬器訓練播放清單。
由於觸發函式是與 Authentication 的典型整合方式,請參閱「在本機執行函式」一文,進一步瞭解 Firebase 專用的 Cloud Functions 模擬器。