[英]Firebase Auth link provider Google sign in issue?
在第一個屏幕截圖中,您使用 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
在我的應用程序中,會發生以下情況。
c_example_account@gmail.com
創建一個帳戶,如 firebaseAuth 儀表板中的信封/郵件圖標所示。 c_example_account@gmail.com
User UID
是相同的。 因此,與該User UID
相關聯的任何內容仍然可以。c_example_account@gmail.com
的電子郵件/密碼登錄方法 (AKA) 提供程序已刪除,因此用戶無法再使用該方法登錄。 重要提示:這是靜默完成的,用戶不會收到任何電子郵件/密碼登錄已刪除的通知。Incorrect Password
。 注意:人們可能期望它會給出一個錯誤,比如“只有 Google 登錄可用”,但事實並非如此。 將此與 email 不存在時(如嘗試垃圾@123457.com)進行對比,后者有錯誤Email is not found...
現在,它變得有點奇怪......
Future<void> resetPassword(String email) async {
await _firebaseAuth.sendPasswordResetEmail(email: email);
}
createUserWithEmailAndPassword()
之類的 await _firebaseAuth.createUserWithEmailAndPassword(
email: email,
password: password,
);
...但這次它是通過“重置”事件創建的
Future<void> resetPassword(String email) async {
await _firebaseAuth.sendPasswordResetEmail(email: email);
}
...通過由 firebaseAuth firebaseAuth service
發送的 email 提供了一個鏈接。 在這種情況下,驗證了 email。
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
覆蓋。
復制自: 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 驗證的情況下創建一個帳戶來訪問現有帳戶。 所以不要那樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.