Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase使用新提供商(Google)登录将删除以前的提供商(密码)_Javascript_Firebase_Firebase Authentication - Fatal编程技术网

Javascript Firebase使用新提供商(Google)登录将删除以前的提供商(密码)

Javascript Firebase使用新提供商(Google)登录将删除以前的提供商(密码),javascript,firebase,firebase-authentication,Javascript,Firebase,Firebase Authentication,我正在使用Firebase(v3)Auth登录,遇到了以下问题: 用户最初使用电子邮件和密码注册 注销 稍后,登录谷歌 我预计会出现一个错误,抱怨电子邮件地址用于其他帐户,然后要求用户键入密码以链接帐户,但Firebase会自动删除电子邮件/密码登录方法并返回成功消息 谷歌认证代码: var provider = new firebase.auth.GoogleAuthProvider(); firebase.auth().signInWithPopup(provider).then(

我正在使用Firebase(v3)Auth登录,遇到了以下问题:

  • 用户最初使用电子邮件和密码注册
  • 注销
  • 稍后,登录谷歌
  • 我预计会出现一个错误,抱怨电子邮件地址用于其他帐户,然后要求用户键入密码以链接帐户,但Firebase会自动删除电子邮件/密码登录方法并返回成功消息

    谷歌认证代码:

    var provider = new firebase.auth.GoogleAuthProvider();
    firebase.auth().signInWithPopup(provider).then(
        result => {
            console.log("federated (google) result", result);
        },
        error => {
            console.log("federated (google) error", error);
        }
    );
    
    使用电子邮件和密码进行身份验证的代码:

    // Login:
    firebase.auth().signInWithEmailAndPassword(this.state.email, this.state.password).then(
        ok => {
            console.log("email/pass sign in success", ok);
        },
        error => {
            console.log("email/pass sign in error", error);
        }
    )
    
    // Register:
    firebase.auth().createUserWithEmailAndPassword(this.state.email, this.state.password).then(
        ok => {
            console.log("Register OK", ok);
        },
        error => {
            console.log("Register error", error);
        }
    )
    
    我看到帐户链接是通过首先使用用户当前的提供者/方法登录用户,然后才为新的身份验证方法/提供者请求凭据/获取令牌来完成的。在我的例子中,我不知道他们是否有其他身份验证提供程序,直到太晚了(Firebase会覆盖它)


    在Firebase覆盖现有帐户的详细信息并要求用户键入密码并链接帐户之前,是否有方法检测电子邮件已被接收?或者,更好的办法是,自动链接这些帐户,因为他们已经使用谷歌登录,并且电子邮件地址匹配?

    我找到了答案。Firebase按其应有的方式运行,这不是技术/编码问题。这更像是一个文档问题

    当用户使用电子邮件和密码注册、注销并使用其他方法(以前从未使用过)登录时,可能会发生两种情况:

  • 如果电子邮件已确认,则当您使用新提供商登录时,会记住电子邮件/密码凭据(这是我问题中所期望的结果)
  • 如果电子邮件未确认,则会更新用户,以便删除电子邮件/密码凭据并保留新的登录方法。像
    displayName
    这样的用户详细信息不会自动更新
  • 您可以尝试使用FirebaseAuth.instance.fetchSignInMethodsForEmail(电子邮件)获取此电子邮件链接的所有身份验证方法的列表。 然后,您可以检查所有的auth方法,并编写考虑到这一点的逻辑

    // After asking the user for their email.
    var email = window.prompt('Please provide your email');
    firebase.auth().fetchSignInMethodsForEmail(email)
      .then((signInMethods) => {
        // This returns the same array as fetchProvidersForEmail but for email
        // provider identified by 'password' string, signInMethods would contain 2
        // different strings:
        // 'emailLink' if the user previously signed in with an email/link
        // 'password' if the user has a password.
        // A user could have both.
        if (signInMethods.indexOf(
                firebase.auth.EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD) != -1) {
          // User can sign in with email/password.
        }
        if (signInMethods.indexOf(
                firebase.auth.EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD) != -1) {
          // User can sign in with email/link.
        }
      })
      .catch((error) => {
        // Some error occurred, you can inspect the code: error.code
      });
    
    我找不到用于此的FlatterFire文档,但我找到了用于此的Web文档。您也可以在颤振中使用它


    按照此链接访问文档:

    因为Firebase 3允许您使用不同的McHanism登录。。您可能希望将不同的机制链接在一起以获得统一的视图。参考答案:那是正确的。我想链接不同的机制,但具体的问题(或困惑,见答案)是,当用户已经拥有一个机制a(比如电子邮件/密码)的帐户,并且下次访问时,他忘记了它,并使用方法B(比如谷歌)登录时会发生什么。电子邮件地址相同,因此应自动链接帐户(按编程方式,您在登录期间不知道已存在该电子邮件的帐户),或者登录应返回错误,以便您可以登录以处理此问题。我在回答中写下了实际发生的情况。你仍然没有回答你自己的问题,有没有办法检测并告诉用户这将要发生?我回答了我问题中的“或者更好”部分。我想做这张支票的唯一目的就是把账户联系起来。因为如果电子邮件被验证,这会自动发生,所以我不需要再做检查了。简而言之,我还没有找到这样做的方法。如果不使用电子邮件验证,最好有一个解决方案,可以在SSO完成之前的某个时间点通知用户(他们的密码将不再工作)。我明白你的意思,很遗憾,我没有为您提供解决方案。找到一份可能对您的答案有用的文档: