Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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
Firebase linkWithCredential在向具有密码身份验证的用户添加emaillink身份验证时引发提供程序已链接错误_Firebase_Firebase Authentication - Fatal编程技术网

Firebase linkWithCredential在向具有密码身份验证的用户添加emaillink身份验证时引发提供程序已链接错误

Firebase linkWithCredential在向具有密码身份验证的用户添加emaillink身份验证时引发提供程序已链接错误,firebase,firebase-authentication,Firebase,Firebase Authentication,我有一个使用电子邮件/密码进行身份验证的用户。当我尝试使用和为用户添加emaillink身份验证时,出现错误: code: "auth/provider-already-linked" message: "User can only be linked to one identity for the given provider." 错误消息告诉我无法为该用户添加emaillink身份验证,因为该用户已使用密码通过电子邮件提供商的身份验证 那么,使用密码

我有一个使用电子邮件/密码进行身份验证的用户。当我尝试使用和为用户添加emaillink身份验证时,出现错误:

code: "auth/provider-already-linked"
message: "User can only be linked to one identity for the given provider."
错误消息告诉我无法为该用户添加emaillink身份验证,因为该用户已使用密码通过电子邮件提供商的身份验证

那么,使用密码身份验证为现有用户添加emaillink身份验证的正确方法是什么

下面是我尝试抛出的“auth/provider ready linked”错误:

  • 使用电子邮件和密码创建用户。发送电子邮件验证
  • const userCred=wait firebase
    .auth()
    .createUserWithEmailAndPassword(电子邮件,密码);
    if(userCred){
    const{user}=userCred;
    等待user.sendEmailVerification());
    }
    
  • 验证电子邮件
  • 等待firebase.auth().applyActionCode(actionCode)
    等待firebase.auth().currentUser.reload())
    
    此时,用户已登录,
    fetchSignInMethodForEmail
    返回
    ['password']

    const signInMethods=wait firebase.auth().fetchSignInMethodsForEmail(电子邮件)
    如果(签名方法){
    console.log(signInMethods)//返回['password']
    }
    
  • 发送登录链接到电子邮件
  • 等待firebase.auth().sendSignInLinkToEmail(电子邮件、actionCodeSettings)
    window.localStorage.setItem('emailForSignIn',email)
    
  • 确认登录链接
  • if(firebase.auth().isSignInWithEmailLink(href)){
    让email=window.localStorage.getItem('emailForSignIn')
    如果(!电子邮件){
    email=window.prompt('请提供您的电子邮件进行确认')
    }
    const credential=firebase.auth.EmailAuthProvider.credentialWithLink(
    电子邮件,
    window.location.href
    );
    火基
    .auth()
    .currentUser.linkWithCredential(凭证)
    。然后((结果)=>{
    console.log('与电子邮件链接成功链接')
    window.localStorage.removietem('emailForSignIn')
    })
    .catch((错误)=>{
    //发生了一些错误。
    console.log('与电子邮件链接链接时出错')
    console.log(错误)
    })
    }
    
    由于我已经登录并与电子邮件提供商链接,因此调用
    firebase.auth.EmailAuthProvider.credentialWithLink
    将抛出错误


    那么,我如何为已经通过电子邮件提供商身份验证的用户添加
    emaillink
    signin方法,而该电子邮件提供商只有
    password
    signin方法?从错误消息中,我知道我不应该使用
    credentialWithLink
    linkWithCredential
    。那么我该怎么办呢?

    您正在尝试将使用电子邮件创建的帐户与其他电子邮件链接。正如错误所说,“对于给定的提供者,用户只能链接到一个标识。”。这意味着一个账户只能有一封电子邮件、谷歌账户、facebook等链接在一起

    如果你想让一个用户有多封电子邮件,那么你可能需要使用一个数据库。

    如果您使用Firestore,那么您可以像这样存储电子邮件,并在需要时进行如下查询:

    userRef.where("emails", "array-contains", "emailEnteredByUser");
    
    注:用户只能使用他们第一次用来创建帐户登录或注册的主电子邮件

    一个解决方法:您实际上可以依靠它来允许用户登录。当用户输入电子邮件并单击“登录”时,您可以运行云功能(或您自己的服务器中的功能)生成登录链接,然后验证用户的文档是否包含他们输入的电子邮件,并使用类似的方式将登录链接发送给他们

    编辑:密码和登录链接是不同的身份验证提供程序。如文件所述:

    用户首次登录后,将创建一个新的用户帐户 创建并链接到凭据,即用户名和 用户签名的密码、电话号码或身份验证提供商信息 与…一致。 因此,如果用户存在电子邮件,您仍然可以使用电子邮件链接


    因此,我想出了如何将emaillink添加到具有电子邮件/密码登录的用户

    TL/DR;使用
    firebase.auth().signInWithEmailLink(电子邮件,href)
    。不要使用
    credentialWithLink
    linkWithCredential

    步骤1-3是正确的,但我需要将步骤4更改为使用
    firebase.auth().signInWithEmailLink(email,href)
    而不是
    credentialWithLink
    linkWithCredential

    以下是正确的步骤4:

    if(firebase.auth().isSignInWithEmailLink(href)){
    让email=window.localStorage.getItem('emailForSignIn')
    如果(!电子邮件){
    email=window.prompt('请提供您的电子邮件进行确认')
    }
    火基
    .auth()
    .signInWithEmailLink(电子邮件,href)
    。然后((结果)=>{
    console.log('与电子邮件链接成功链接')
    window.localStorage.removietem('emailForSignIn')
    })
    .catch((错误)=>{
    //发生了一些错误。
    console.log('使用电子邮件链接登录时出错')
    console.log(错误)
    })
    }
    
    我不希望用户有多封电子邮件。电子邮件验证提供程序有两种登录方法:密码和电子邮件链接。我希望具有密码登录方法的用户也具有emaillink登录方法。我认为没有必要使用Firestore。Firebase Auth应该足够了。@kimbaudi这是一样的。即使设置了密码验证,也可以使用sendSignInLink方法。电子邮件与密码或链接相同。如果您使用了link进行登录并希望添加密码,那么您必须使用updatepassword方法。这里没有链接,我找到了解决办法。使用
    firebase.auth().signInWithEmailLink(电子邮件,href)
    。仅此而已。不需要Firestore。没有解决办法。只需致电
    signInWithEmailLink
    @kimbaudi即可。我已经用正确的文档链接更新了解决方案。如果答案是有帮助的,你可以接受它,这样其他人就知道它已经解决了,其他人可以随意问傅