Firebase linkWithCredential在向具有密码身份验证的用户添加emaillink身份验证时引发提供程序已链接错误
我有一个使用电子邮件/密码进行身份验证的用户。当我尝试使用和为用户添加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身份验证,因为该用户已使用密码通过电子邮件提供商的身份验证 那么,使用密码
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即可。我已经用正确的文档链接更新了解决方案。如果答案是有帮助的,你可以接受它,这样其他人就知道它已经解决了,其他人可以随意问傅