我通过Firebase了解到,通过将auth提供程序凭据链接到现有用户帐户,我可以允许用户使用多个身份验证提供程序登录我的应用程序。有可能链接自定义身份验证提供程序,如Linkedin?我读到我需要将AuthCredential对象传递给已登录用户的linkWithCredential方法,但我找不到自定义的AuthCredential。
答案 0 :(得分:7)
将不受支持的提供商自定义令牌链接到现有帐户的一种方法是获取Firebase帐户的用户ID和不受支持的提供商用户ID,并保存一个哈希映射,该哈希映射会接收不受支持的提供者ID并返回firebase你要链接的uid。当用户使用自定义令牌登录到不受支持的提供程序时,您将从映射中获取相应的firebase uid,并返回一个自定义令牌,该令牌位于signInWithCustomToken与原始firebase用户解析时。
缺点是您在用户的提供者数据列表中看不到不受支持的提供者。您还需要存储地图。
答案 1 :(得分:1)
我想扩展 bojeil 的答案。
支持的提供程序有 firebaseUser.linkWithCredential(credential)
,但不等同于 customProvider。链接 customProvider 必须由后端完成(或者可能像 Firebase 函数一样)。 因为 link
表示其中之一:
到 Firebase User
对象。
流程是这样的:
email
、phone
或一些独特的信息,并将它们发送到后端,包括 firebaseToken
。FirebaseUser
对象。 (后端还必须检查这些数据是否已附加到其他用户。您可能会拒绝链接,因为已经有其他用户使用这些电子邮件、电话...)<CustomProviderId-FirebaseUserId>
对保存在某处(例如:FireStore
)。这样做是因为将来,当用户想要使用 customProvider 登录时,后端需要使用该用户的 CustomToken
创建 firebaseAuth.signInWithCustomToken
(以便客户端可以调用 Firebase Id
)。所以这个映射是解决这个问题的方法。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
用户,则 linking customProvider 可能不会更新客户端上的 firebaseUser.isAnonymous
,如果电子邮件/电话未更新,客户端仍会将 firebaseUser 视为匿名用户。一种解决方案是检查 linksProviders 是否为空以将用户视为匿名用户,如果您的业务逻辑没问题。其他解决方案是当您使用 signInWithCustomToken
登录用户时匿名用户状态更改。所以在链接 customProvider 成功后,静默注销并使用 customToken 登录,这样用户就不会匿名了。email
的 customProvider 链接到匿名用户,则该用户的 email
字段会更新。这将 force client to logout and throw FirebaseAuthInvalidUserException
与错误代码 ERROR_USER_TOKEN_EXPIRED
。用户必须重新登录。