簡體   English   中英

Firebase Auth 鏈接提供商 Google 登錄問題?

[英]Firebase Auth link provider Google sign in issue?

第一次使用 Gmail 和密碼注冊時,firebase 正確保存了憑據。 但是下一次,我使用 Firebase Google 身份驗證登錄,使用我在注冊時提供的相同 Gmail,憑據在 firebase 帳戶中被覆蓋。 覆蓋憑據后,我們無法使用該注冊憑據登錄。 誰能解釋如何實現這一目標?

使用 Gmail 和密碼注冊

谷歌認證

發生了什么

在第一個屏幕截圖中,您使用 Firebase 的電子郵件+密碼提供商登錄。 雖然這是一種有效的登錄方法,但這意味着任何人都可以輸入該 email 地址,即使他們實際上無法訪問該 gmail 地址的 Google 帳戶。

這里不存在安全風險,但是我們可以對 email 地址的值的信任度較低。 由於這個原因,帳戶的emailVerified屬性被標記為false ,您通常需要要求用戶在允許他們繼續之前驗證他們的 email 地址。


在第二個屏幕截圖中,用戶使用相同的 email 地址登錄,但現在使用 Firebase 的google.com提供商登錄。 這意味着 Google 現在已經驗證用戶可以訪問該帳戶的底層 gmail 地址。 由於google.com提供程序是@gmail.com帳戶的受信任提供程序,因此系統將替換以前的帳戶。


另見:

你可以做什么

您通常希望防止多個用戶使用相同的 email 地址進行注冊。 為此,您需要將 Firebase 配置為在控制台中每個 email 地址只允許一個帳戶,然后使用帳戶鏈接,以便合並您方案中的兩個(電子郵件+密碼和 google.com)帳戶。

您是否在第一次登錄嘗試時驗證了 email 或電話號碼? 如果沒有,這是設計使然:

登錄完成后,任何以前未經驗證的登錄機制都將從用戶中刪除,任何現有會話都將失效。 例如,如果有人之前使用相同的 email 和密碼創建了一個未經驗證的帳戶,則該用戶的密碼將被刪除,以防止聲稱擁有所有權並創建該未經驗證帳戶的冒充者使用未經驗證的 email 和密碼再次登錄。

資源

我剛剛遇到了這個問題,這里有一個更長更深入的描述。 (情況經常變化,2021 年 11 月確實如此。)

簡短版:正如@Frank van Puffelen所說,這是設計使然。 問題是email+password通常不是受信任的提供商,因此像Google Authentication這樣的受信任提供商會覆蓋該方法。 它默默地這樣做(我認為,沒有檢查GoogleSignInAuthentication object 中的每個字段。)

它會在密碼重置后自動鏈接。 因此,一種選擇是讓用戶通過_firebaseAuth.sendPasswordResetEmail(email: email);設置他們的密碼。

另外:我不建議像其他人建議的那樣關閉One account per email address 看到最后的原因。

默認情況下的“奇怪”行為One account per email address

在我的應用程序中,會發生以下情況。

  1. 通過電子郵件+密碼注冊 testUser1234@gmail.com。
  2. 使用 provider=Email/Password 為c_example_account@gmail.com創建一個帳戶,如 firebaseAuth 儀表板中的信封/郵件圖標所示。 初始 FirebaseAuth 儀表板的圖片
  3. 注銷並通過 Google 重新登錄登錄c_example_account@gmail.com
  4. 提供者已更改。 舊提供商是電子郵件/密碼圖標(信封)。 新的提供商是 Google 圖標。 (如屏幕截圖中的底部三個帳戶)。 另請注意, User UID是相同的。 因此,與該User UID相關聯的任何內容仍然可以。
  5. 由於c_example_account@gmail.com的電子郵件/密碼登錄方法 (AKA) 提供程序已刪除,因此用戶無法再使用該方法登錄。 重要提示:這是靜默完成的,用戶不會收到任何電子郵件/密碼登錄已刪除的通知。
  6. 嘗試使用電子郵件/密碼登錄將導致Incorrect Password 注意:人們可能期望它會給出一個錯誤,比如“只有 Google 登錄可用”,但事實並非如此。 將此與 email 不存在時(如嘗試垃圾@123457.com)進行對比,后者有錯誤Email is not found...

現在,它變得有點奇怪......

  1. 假設用戶使用“重置密碼”就像這樣被調用
  Future<void> resetPassword(String email) async {
    await _firebaseAuth.sendPasswordResetEmail(email: email);
  }
  1. 然后, firebaseAuth控制台對相同的 USER UID 有兩種方法。 請參閱屏幕截圖中的第二行和第三行。 密碼重置后的雙重登錄方式
  2. 現在,這兩種方法都被允許。 不同的是,第一次是createUserWithEmailAndPassword()之類的
      await _firebaseAuth.createUserWithEmailAndPassword(
        email: email,
        password: password,
      );

...但這次它是通過“重置”事件創建的

  Future<void> resetPassword(String email) async {
    await _firebaseAuth.sendPasswordResetEmail(email: email);
  }

...通過由 firebaseAuth firebaseAuth service發送的 email 提供了一個鏈接。 在這種情況下,驗證了 email。

  1. 回顧:現在這兩種方法都有效。 這兩種方法是 (1) Google 身份驗證和 (2) 電子郵件/密碼。 在谷歌的說法中,這些帳戶已被鏈接: https://firebase.google.com/docs/auth/android/account-linking 鏈接意味着一個User UID ,多種登錄方式

為什么用兩種不同的方法創建電子郵件/密碼時會出現奇怪的行為?

~~我在firebaseAuth中找不到這個記錄,可能是因為我看起來不夠努力,或者可能因為這不是一個常見的問題。 ~~ 此行為記錄在2020 年 4 月的問題評論中

我認為原因是因為_firebaseAuth.createUserWithEmailAndPassword版本具有未經驗證的 email 因此,假設電子郵件+密碼組合不存在,任何人都可以為其他任何人創建帳戶。 例如,我可以使用用戶名president@whitehouse.gov創建一個帳戶,而實際上沒有訪問該 email 的權限。 如果實際的總統通過Google Authentication登錄,那么我就可以偽造訪問該用戶的信息。 除了聰明的谷歌工程師決定,經過驗證的Google Authentication然后觸發刪除未經驗證Email/Password提供程序/帳戶實例。

簡而言之,邏輯可能是:已驗證的勝過/未驗證的覆蓋。 請參閱https://firebase.google.com/docs/auth/users#verified_email_addresses

同樣,對於電子郵件/密碼,這些都沒有明確記錄。 但它在文檔中有所暗示,例如Facebook Auth帳戶是否被Google Auth覆蓋。


已驗證 Email 詳細信息的快照

復制自: https://firebase.google.com/docs/auth/users#verified_email_addresses

由我添加的粗體,用於強調

在某些情況下,當用戶使用相同的 email 地址登錄不同的提供商時,Firebase 將自動鏈接帳戶。 但是,這只有在滿足特定標准時才會發生。 要了解原因,請考慮以下情況:用戶使用 @gmail.com 帳戶使用 Google 登錄,而惡意行為者使用相同的 @gmail.com 地址創建帳戶,但通過 ZD85544FCE402C7A2A936A48078ED 登錄。 如果這兩個帳戶被自動鏈接,惡意行為者將獲得對用戶帳戶的訪問權限。

以下情況描述了我們何時自動關聯帳戶以及何時拋出需要用戶或開發人員操作的錯誤:

  • 用戶使用不受信任的提供商登錄,然后使用具有相同 email 的另一個不受信任的提供商登錄(例如,Facebook 后跟 GitHub)。 這會引發需要帳戶鏈接的錯誤。
  • 用戶使用受信任的提供商登錄,然后使用具有相同 email 的不受信任的提供商登錄(例如,Google 后跟 Facebook)。 這會引發需要帳戶鏈接的錯誤。
  • 用戶使用不受信任的提供商登錄,然后使用具有相同 email 的受信任提供商登錄(例如,Facebook 后跟 Google)。 受信任的提供者覆蓋不受信任的提供者 如果用戶嘗試使用 Facebook 再次登錄,則會導致需要帳戶鏈接的錯誤。
  • 用戶使用受信任的提供商登錄,然后使用具有相同 email 的不同受信任提供商登錄(例如,Apple 后跟 Google)。 兩個提供者將無錯誤地鏈接。

您可以手動設置 email 並使用管理員 SDK 進行驗證,但我們建議您僅在知道用戶確實擁有 email 時才這樣做。


為什么不關閉One account per email address

默認情況下,@ Deva所寫的One account per email address處於活動狀態。 但是,取消選中這意味着同一個 email 有兩個不同的帳戶( User UIDs )。 一種通過Email/Password ,另一種通過Google Authentication 他們將在Firebase Auth中有單獨的用戶 UID ,這可能會讓您感到困惑。 此外,如果您在您的應用程序中手動鏈接兩個User UIDs ,這會產生一個安全漏洞:有人可以在沒有 email 驗證的情況下創建一個帳戶來訪問現有帳戶。 所以不要那樣做。


相關 StackOverflow 問題和鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM