5

我读到使用 Firebase 可以允许用户通过将身份验证提供程序凭据链接到现有用户帐户来使用多个身份验证提供程序登录我的应用程序。是否可以链接自定义身份验证提供程序,例如 Linkedin?我读到我需要将 AuthCredential 对象传递给登录用户的 linkWithCredential 方法,但我没有找到自定义 AuthCredential。

4

2 回答 2

10

将不受支持的提供者自定义令牌链接到现有帐户的一种方法是获取 Firebase 帐户的用户 ID 和不受支持的提供者用户 ID,并保存一个哈希映射,其中包含不受支持的提供者 ID 并返回要链接到的 Firebase uid . 当用户使用自定义令牌登录到不受支持的提供程序时,您会从地图中获取相应的 firebase uid 并返回带有该 uid 的自定义令牌,该 uid 在 signInWithCustomToken 上与原始 firebase 用户一起解析。

缺点是您在用户的提供者数据列表中看不到不受支持的提供者。您还需要存储地图。

于 2016-10-21T18:07:06.063 回答
1

我想扩展bojeil的答案。

firebaseUser.linkWithCredential(credential)支持的提供者,但不等同于 customProvider。链接 customProvider 必须由后端完成(或者可能像 Firebase 函数)。因为link意味着其中之一:

  • 添加电子邮件
  • 添加电话号码
  • 自定义逻辑(添加用户声明)

Firebase User对象。

流程是这样的:

  1. 客户从 customProvider(Line、LinkedIn、Huawei...)获取emailphone一些独特的信息,并将它们发送到后端,包括firebaseToken.
  2. (后端可以通过询问 customProvider 来验证这些数据)。然后后端将这些信息添加到FirebaseUser对象。(后端还必须检查这些数据是否已经附加到其他用户。您可能会拒绝链接,因为已经有另一个用户使用这些电子邮件、电话......)
  3. 后端将<CustomProviderId-FirebaseUserId>配对保存在某处(例如:) FireStore。这样做是因为将来,当用户想要使用 customProvider 登录时,后端需要创建CustomToken(以便客户端可以调用firebaseAuth.signInWithCustomToken)使用Firebase Id该用户。所以这个映射是这个问题的解决方案。
  4. 后端将响应 200 HTTP 响应代码,表示链接成功
  5. 客户调用firebaseUser.reload()以获取新附加的数据(电子邮件、电话等...)
  6. 如果在步骤 2 中更新了用户声明,则客户端还必须调用firebaseUser.getIdToken(force=true)以获取更新的用户声明。

挑战

  • 如果 customProvider 只给email,您需要检查该电子邮件是否已附加到任何其他用户。
  • 如果 customProvider 只给phone,您需要检查该手机是否已连接到任何其他用户。
  • 如果 customProvider 可以同时提供emailand phone,则复杂性会增加,因为您必须检查其中是否有任何已附加到任何其他用户。
  • 如果 customProvider 不提供emailphone,那么您需要该自定义提供者的该用户的唯一信息(例如华为用户 ID)。
  • CustomProvider 不会在firebaseUser.providerData列表中,因此您可以添加用户声明。(例如{kakaoTalk:true, huawei:true})。根据情况,你不需要那个。例如,如果 customProvider 是 WhatsApp,那么如果phone存在firebaseUser.phoneNumber则意味着 WhatsApp 已链接(甚至电话是使用另一个登录提供商添加的)。
  • 如果您允许Anonymous用户,则如果电子邮件/电话未更新,则链接 customProvider可能不会firebaseUser.isAnonymous在客户端上更新,客户端仍会将 firebaseUser 视为匿名的。一种解决方案是检查linkedProviders 是否为空以将用户视为匿名用户,如果您的业务逻辑可以。其他解决方案是使用signInWithCustomToken. 因此,在链接 customProvider 成功后,静默注销并使用 customToken 登录,这样用户就不会匿名了。
  • 如果您将 customProvider 链接email到匿名用户,则该用户的email字段会更新。这将强制客户端注销并抛出 FirebaseAuthInvalidUserExceptionerrorCode ERROR_USER_TOKEN_EXPIRED。用户必须重新登录。
于 2021-03-14T15:36:29.310 回答