【问题标题】:Firebase Auth linking anonymous auth user with custom auth userFirebase 身份验证将匿名身份验证用户与自定义身份验证用户联系起来
【发布时间】:2016-10-18 07:18:53
【问题描述】:

所以我在这里看到:https://firebase.google.com/docs/auth/web/account-linking#link-auth-provider-credentials-to-a-user-account 现在可以在 Firebase 中链接用户帐户。我还看到 Firebase 提供匿名身份验证功能,它为用户创建用户会话,无需任何凭据。

在我们的应用程序中,我们通常将 CustomAuthentication 与 Firebase 一起使用,因为我们有自己的身份验证服务。这非常有效,我们可以在使用 Firebase 的系统和不使用 Firebase 的系统之间使用相同的身份验证系统。

现在我们想要利用 Firebase 的匿名身份验证,让用户无需注册即可使用应用程序,只需在登录后传输他们的详细信息。所以我认为帐户链接是什么我需要。但是我找不到将匿名帐户与自定义身份验证帐户相关联的方法。 Firebase 是否可以实现这样的功能?

【问题讨论】:

    标签: authentication firebase credentials


    【解决方案1】:

    警告:我从来没有这样做过。你见过this page吗?在底部的“电子邮件密码登录”标题下,它列出了以下代码片段:

    var credential = firebase.auth.EmailPasswordAuthProvider.credential(email, password);
    

    然后您可以(显然)像这样链接凭证:

    auth.currentUser.link(credential).then(function(user) {
      console.log("Anonymous account successfully upgraded", user);
    }, function(error) {
      console.log("Error upgrading anonymous account", error);
    });
    

    【讨论】:

    • 嘿,是的,我看到了,我看到可以将匿名帐户与电子邮件/密码凭据以及 Google 或 Facebook 帐户相关联。但我特别想链接到使用自定义身份验证创建的帐户 (firebase.google.com/docs/auth/web/custom-auth),但我在文档中找不到任何相关信息。不过感谢您的回复。
    • signInWithCustomToken返回的user对象没有link方法吗?
    【解决方案2】:

    我也没有找到匿名和自定义登录之间的链接,所以我只是使用 signInAnonymously 并将它的 uid 传递给 signInWithCustomToken。

    第 1 步。 为了能够实现这一点,您应该从 signInAnonymously 函数中获取一个 uid,如下所示:

    var uid;
    auth().signInAnonymously().then(user => {
      uid = user.uid;
    });
    

    第 2 步。 像这样保存当前用户数据:

    database().ref(`users/${uid}`).set({ some: 'data' });
    

    第 3 步。 将此 uid 发送到返回自定义令牌的服务器。在您的服务器上,您只需将此 uid 传递给 firebase.auth().createCustomToken(uid) 函数并将此自定义令牌发回。它将包含 uid。

    第 4 步。 当您收到自定义令牌时,您可以像这样使用它登录:

    auth().signInWithCustomToken(authKey);
    

    就是这样。您已使用自定义令牌登录,并且可以访问在第 2 步中保存的匿名用户数据。

    【讨论】:

    • 您应该确保不会在任何地方公开这些 uid,因为有人可能会劫持匿名用户数据并将该数据绑定到他们的帐户。我觉得有必要这么说,因为一般规则是暴露 uid 是无害的。 stackoverflow.com/questions/42620723/…
    • 聪明的解决方案!因为您获得了已经安全的安全令牌,所以您可以通过您的方法简单地将任何匿名用户转换为管理员用户。谢谢你:)
    【解决方案3】:

    我遇到了类似的问题,但我认为 Firebase 不允许这种类型的链接,因为它需要链接两个单独的 Firebase 用户 ID:自定义令牌创建用户的 ID 和匿名用户的 ID。

    Firebase docs说:

    用户可以通过相同的 Firebase 用户 ID 来识别,无论他们用于登录的身份验证提供商是什么。

    因此处理两个用户 ID 之间的链接会导致不一致。

    我通过合并两个帐户之间的数据解决了这个问题。

    例如(来自 Firebase 文档):

    // Get reference to the currently signed-in user
    var prevUser = auth.currentUser;
    // Sign in user with another account
    auth.signInWithCredential(credential).then(function(user) {
      console.log("Sign In Success", user);
      var currentUser = user;
      // Merge prevUser and currentUser accounts and data
      // ...
    }, function(error) {
      console.log("Sign In Error", error);
    });
    

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 2022-12-10
      • 2017-03-18
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 2021-07-31
      相关资源
      最近更新 更多