Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

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

在將Authentication Emulator與您的應用程序一起使用之前,請確保您了解Firebase Local Emulator Suite的整體工作流程,安裝並配置Local Emulator Suite。

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

身份驗證模擬器可提供Firebase身份驗證服務的高保真本地模擬,從而提供生產Firebase身份驗證中提供的許多功能。通過與iOS,Android和Web Firebase SDK結合使用,該模擬器可讓您:

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

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

Android,iOS和Web SDK

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

安卓
FirebaseAuth.getInstance().useEmulator('10.0.2.2', 9099);
iOS-Swift
Auth.auth().useEmulator(withHost:"localhost", port:9099)
網頁
var auth = firebase.auth();
auth.useEmulator("http://localhost:9099");

無需其他設置即可為Cloud Firestore或實時數據庫的身份驗證和雲功能或Firebase安全規則之間的交互建立原型和測試。配置了身份驗證仿真器並且其他仿真器正在運行時,它們會自動協同工作。

管理員SDK

設置FIREBASE_AUTH_EMULATOR_HOST環境變量後,用於Node.js的Firebase Admin SDK會自動連接到身份驗證模擬器。

export FIREBASE_AUTH_EMULATOR_HOST="localhost:9099"

請注意,Cloud Functions仿真器會自動識別身份驗證仿真器。如果您正在測試Cloud Functions和Authentication之間的集成,則不需要以這種方式聲明Authentication emulator主機。

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

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

ID令牌

出於安全原因,身份驗證模擬器會發布未簽名的ID令牌,這些令牌僅在Cloud Functions模擬器中運行時才被Firebase Admin SDK的verifyIdTokencreateSessionCookie接受。在任何其他環境(例如Cloud Run或您自己的服務器)中運行時,這些令牌將被Admin SDK拒絕。

要開始使用Authentication仿真器和Emulator Suite UI進行交互式原型製作,請啟動Firebase Local Emulator Suite。

firebase emulators:start

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

對於電子郵件/密碼身份驗證,您可以通過使用Authentication SDK方法或通過使用Emulator Suite UI將用戶帳戶從應用程序添加到身份驗證模擬器中來開始進行原型製作。

  1. 在Emulator Suite用戶界面中,單擊“身份驗證”選項卡。
  2. 單擊添加用戶按鈕。
  3. 遵循用戶帳戶創建嚮導,填寫電子郵件身份驗證字段。

創建測試用戶後,您的應用可以使用適用於您平台( iOSAndroidWeb )的SDK邏輯來簽入和簽出用戶。

為了使用電子郵件鏈接流測試電子郵件驗證/登錄,仿真器會將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. 使用Authentication signUp REST端點創建用戶。
  2. 使用電子郵件和密碼登錄用戶以執行測試。
  3. 如果適用於您的測試,請從特定仿真器的REST endpont中獲取可用的帶外電子郵件驗證代碼。
  4. 使用特定仿真器的REST端點刷新用戶記錄,以清除數據。

模擬電話/ SMS身份驗證

對於電話身份驗證,Auth仿真器不支持:

  • reCAPTCHA和APN流。一旦配置為與仿真器進行交互,客戶端SDK就會以類似於集成測試中所述的方式( iOSAndroidWeb )禁用這些驗證方法。
  • 使用在Firebase控制台中預先配置的代碼測試電話號碼。

否則,就客戶端代碼而言,電話/ SMS身份驗證流程與針對生產環境( iOSAndroidWeb )所述的流程相同。

使用仿真器套件用戶界面:

  1. 在Emulator Suite用戶界面中,單擊“身份驗證”選項卡。
  2. 單擊添加用戶按鈕。
  3. 遵循用戶帳戶創建嚮導,填寫電話身份驗證字段。

但是,對於電話驗證流程,仿真器將不會觸發任何文本消息的傳遞,因為與運營商聯繫超出了範圍,並且不適合進行本地測試!相反,模擬器會打印出通過SMS發送到運行firebase emulators:start的同一終端的代碼firebase emulators:start將此代碼輸入到應用中,以模擬用戶檢查其短信。

非交互式測試

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

典型的順序如下。

  1. 調用平台signInWithPhoneNumber以啟動驗證過程。
  2. 使用特定仿真器的REST端點檢索驗證碼。
  3. 照常使用驗證碼調用confirmationResult.confirm(code)

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

身份驗證模擬器可讓您在iOS,Android或Web應用程序中測試許多第三方身份驗證流,而無需更改生產代碼。有關身份驗證流程的示例,請參閱文檔以獲取可在應用程序中使用的提供商和平台的各種組合

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

  • 您的應用程序可讓SDK端到端處理整個流程,包括與第三方IDP提供程序進行的所有交互以檢索憑據。
  • 您的應用使用該第三方的SDK手動從第三方提供商檢索憑據,並將這些憑據傳遞給Authentication SDK。

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

測試Firebase SDK驅動的IDP流

如果您的應用使用任何Firebase SDK端到端流程(例如OAuthProvider進行Microsoft,GitHub或Yahoo登錄)進行交互式測試,則Authentication仿真器會提供相應登錄頁面的本地版本以幫助您進行測試調用signinWithPopupsignInWithRedirect方法的Web應用程序進行身份驗證。該本地服務的登錄頁面也會顯示在移動應用中,由平台的Webview庫呈現。

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

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

如果您使用“手動”登錄技術並調用平台的signInWithCredentials方法,則您的應用程序將照常請求真實的第三方登錄並檢索真實的第三方憑據。

請注意,對於從Google Sign-In,Apple和其他使用ID令牌實現的提供程序檢索的憑據,模擬器僅支持signInWithCredential身份驗證,這些ID令牌實現為JSON Web令牌(JWT)。不支持訪問令牌(例如,不是JWT的Facebook或Twitter提供的令牌)。下一節將討論這些情況下的替代方法。

非交互式測試

非交互式測試的一種方法是使用戶在模擬器提供的登錄頁面上的點擊自動化。對於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。

接下來是什麼?