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

时间:2016-10-21 08:20:17

标签: android firebase linkedin firebase-authentication custom-authentication

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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 可以同时提供 emailphone,复杂性会增加,因为您必须检查是否已经附加到任何其他用户。
  • 如果 customProvider 不提供 emailphone,那么您需要该自定义提供程序的该用户的唯一信息(例如华为用户 ID)。
  • CustomProvider 不会在 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。用户必须重新登录。