【问题标题】:Linking custom auth provider with Firebase将自定义身份验证提供程序与 Firebase 相关联
【发布时间】:2017-03-03 11:18:09
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我想扩展 bojeil 的答案。

    支持的提供者有firebaseUser.linkWithCredential(credential),但不等同于customProvider。链接 customProvider 必须由后端(或者可能像 Firebase Functions 之类的东西)完成。 因为link 表示以下之一:

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

    Firebase User 对象。

    流程是这样的:

    1. 客户从customProvider(Line、LinkedIn、华为...)获得emailphone或一些独特的信息,并将它们发送到后端,包括firebaseToken
    2. (后端可以通过询问 customProvider 来验证这些数据)。然后后端将这些信息添加到FirebaseUser 对象。 (后端还必须检查这些数据是否已经附加到其他用户。您可能会拒绝链接,因为已经有其他用户使用这些电子邮件、电话......)
    3. 后端将<CustomProviderId-FirebaseUserId> 对保存在某处(例如:FireStore)。这样做是因为将来,当用户想要使用 customProvider 登录时,后端需要使用该用户的Firebase Id 创建CustomToken(以便客户端可以调用firebaseAuth.signInWithCustomToken)。所以这个映射是解决这个问题的方法。
    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 登录,这样用户就不会匿名了。
    • 如果您将带有email 的customProvider 链接到匿名用户,则该用户的email 字段将被更新。这将force client to logout and throwFirebaseAuthInvalidUserException 错误代码ERROR_USER_TOKEN_EXPIRED。用户必须重新登录。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 为了明确这个答案,简单的令牌“uid”应该与当前用户ID相同。例如,用户以匿名身份登录,用户 ID 为“V5T0SE15mublW3gTr9lr04q7uxG3”。现在,您可以使用 uid 创建新令牌:“V5T0SE15mublW3gTr9lr04q7uxG3”,因为您知道当前的用户 ID。获得新令牌后,您可以再次登录:signInWithCustomToken( newToken )。这两个用户合并了。
      • @dino 仅此一条评论,我不骗你,是整个互联网上唯一给我所需信息的东西。我有一个普通的 rest API 后端,但我的用户首先在客户端创建基于 firebase 提供程序的帐户,然后使用经过验证的 jwt 有效负载进行查找/创建。我试图弄清楚如何使用 REST auth api 来管理帐户,但我需要将自定义令牌交换为 idtoken。一旦我开始使用 firebase id 对我的自定义 jwt 进行签名并登录,我现在终于可以将自定义令牌交换为 idToken
      • 我认为混乱来自没有办法将现有帐户“链接”到 customToken,所以我认为用我自己的 jwt 重新登录用户会导致帐户重复,它甚至从未交叉我的想法是使用相同的标识符
      • 这对我帮助很大,实现实际上比我预期的要简单。我从没想过我可以使用现有的 Firebase 用户 ID 创建新令牌...
      猜你喜欢
      • 2017-02-27
      • 2021-01-03
      • 2012-04-05
      • 1970-01-01
      • 2018-03-26
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多