将自定义身份验证提供程序与Firebase链接

mar*_*ary 4 android linkedin custom-authentication firebase firebase-authentication

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

boj*_*eil 8

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

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

  • 为了清楚这个答案,令牌的"uid"应与当前用户ID相同.例如,用户使用"V5T0SE15mublW3gTr9lr04q7uxG3"用户ID以Anonymous身份登录.现在,您可以使用uid创建新令牌:"V5T0SE15mublW3gTr9lr04q7uxG3",因为您知道当前用户ID.一旦你获得了新的令牌,你就可以再次登录:`signInWithCustomToken(newToken)`.这两个用户合并. (3认同)
  • 我认为造成混乱的原因是无法将现有帐户“链接”到 customToken,因此我假设使用我自己的 jwt 重新登录用户会导致帐户重复,我什至从未想过使用相同的标识符 (2认同)

Jem*_*rov 6

我想扩展 bojeil 的答案。

适用firebaseUser.linkWithCredential(credential)于受支持的提供程序,但与自定义提供程序不等效。链接 customProvider 必须由后端完成(或者可能是 Firebase Functions 之类的东西)。因为link意味着以下之一:

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

Firebase User对象。

流程是这样的:

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

存在挑战

  • 如果 customProvider 仅提供email,您需要检查该电子邮件是否已附加到任何其他用户。
  • 如果 customProvider 仅提供phone,您需要检查该电话是否已连接到任何其他用户。
  • 如果 customProvider 可以同时提供emailphone,则复杂性会增加,因为您必须检查其中任何一个是否已附加到任何其他用户。
  • 如果 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。用户必须重新登录。