[英]Linking custom auth provider with Firebase
我讀到使用 Firebase 我可以允許用戶通過將身份驗證提供程序憑據鏈接到現有用戶帳戶來使用多個身份驗證提供程序登錄我的應用程序。 是否可以鏈接自定義身份驗證提供程序,例如 Linkedin? 我讀到我需要將 AuthCredential 對象傳遞給登錄用戶的 linkWithCredential 方法,但我沒有找到自定義的 AuthCredential。
將不受支持的提供者自定義令牌鏈接到現有帳戶的一種方法是獲取 Firebase 帳戶的用戶 ID 和不受支持的提供者用戶 ID 並保存一個哈希映射,該映射接受不受支持的提供者 ID 並返回您要鏈接到的 Firebase uid . 當用戶使用自定義令牌登錄到不受支持的提供程序時,您會從地圖中獲取相應的 firebase uid 並返回帶有該 uid 的自定義令牌,該 uid 在 signInWithCustomToken 上與原始 firebase 用戶解析。
缺點是您在用戶的提供者數據列表中看不到不受支持的提供者。 您還需要存儲地圖。
我想擴展 bojeil 的答案。
支持的提供者有 firebaseUser.linkWithCredential firebaseUser.linkWithCredential(credential)
,但不等同於 customProvider。 鏈接 customProvider 必須由后端完成(或者可能像 Firebase 函數一樣)。 因為link
意味着其中之一:
到Firebase User
對象。
流程是這樣的:
email
、 phone
或一些獨特的信息,並將它們發送到后端,包括firebaseToken
。FirebaseUser
對象。 (后端還必須檢查這些數據是否已經附加到其他用戶。您可能會拒絕鏈接,因為已經有其他用戶使用這些電子郵件、電話......)<CustomProviderId-FirebaseUserId>
對保存在某處(例如: FireStore
)。 這樣做是因為將來,當用戶想要使用 customProvider 登錄時,后端需要使用該用戶的Firebase Id
創建CustomToken
(因此客戶端可以調用firebaseAuth.signInWithCustomToken
)。 所以這個 Mapping 是這個問題的解決方案。firebaseUser.reload()
以獲取新附加的數據(電子郵件、電話等...)firebaseUser.getIdToken(force=true)
以獲取更新的用戶聲明。有挑戰:
email
,您需要檢查該電子郵件是否已附加到任何其他用戶。phone
,您需要檢查該電話是否已連接到任何其他用戶。email
和phone
,則復雜性會增加,因為您必須檢查是否已經附加到任何其他用戶。email
或phone
,那么您需要該自定義提供商的該用戶的唯一信息(例如華為用戶 ID)。firebaseUser.providerData
列表中,因此您可以添加用戶聲明。 (例如{kakaoTalk:true, huawei:true}
)。 根據情況,您不需要那個。 例如,如果是customProvider WhatsApp的,那么如果phone
中存在firebaseUser.phoneNumber
它意味着WhatsApp的鏈接(即使電話被使用在提供商另一個標志添加)。Anonymous
用戶,然后鏈接customProvider可能不會更新firebaseUser.isAnonymous
客戶端,如果沒有更新的電子郵件/電話,客戶仍然會看到firebaseUser匿名。 一種解決方案是檢查 linksProviders 是否為空以將用戶視為匿名用戶,如果您的業務邏輯沒問題。 其他解決方案是當您使用signInWithCustomToken
登錄用戶時匿名用戶狀態更改。 因此,在鏈接 customProvider 成功后,靜默注銷並使用 customToken 登錄,這樣用戶就不是匿名的。email
鏈接到匿名用戶,則會更新該用戶的email
字段。 這將強制客戶端注銷並拋出FirebaseAuthInvalidUserException
ERROR_USER_TOKEN_EXPIRED
。 用戶必須重新登錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.