在这种情况下,我想处理linkWithPopup和Firebase的"auth/credential alre



我阅读了使用JavaScript的谷歌登录进行身份验证,但我看不到错误代码auth/credential-already-in-use的解决方案。

基本上,我尝试链接WithPopup,但用户之前已经在另一个浏览器中登录,所以我无法链接他,所以我可以简单地在这个浏览器中登录他,不需要链接。

这就是为什么我得到这个错误auth/credential-already-in-use

我有这样的代码:
(firebase.auth.currentUser是一个匿名登录用户(

onSocialLoginLink = provider => {
const { firebase, changeUserRole } = this.props;
firebase.auth.currentUser
.linkWithPopup(firebase[provider])
.then(res => {
if (res.credential) {
// do stuff;
}
})
.catch(error => {
if (error.code == 'auth/credential-already-in-use') {
// Here I want to directly sign in with this credential 
console.log('linkWithProvider Failure, error', error);
console.log('linkWithProvider Failure, error["credential"]', error['credential']);
} else {
this.setState({ error });
}
});
};

我是这方面的初学者,在文档中找不到如何做到这一点。在执行signInWithPopup之前,我是否必须先注销匿名用户?在没有用户交互、没有signInWithPopup的情况下,有可能做到这一点吗?

当我在.catch(error =...中时,我知道像Gmail这样的证明者和特定用户的Gmail地址。我从error.credential那里得到的

或者这可能是一个糟糕的解决方案,请建议?

我自己也有同样的问题。谢谢你的提问。我只是查看了文档,发现了以下内容:

身份验证/凭据已在使用如果与凭据对应的帐户已存在于您的用户中,或者已链接到Firebase用户,则抛出。例如,如果您通过链接谷歌凭据将匿名用户升级为谷歌用户,并且使用的谷歌凭据已与现有Firebase谷歌用户关联,则可能会引发此错误。还提供了error.email和error.credential(firebase.auth.AuthCredential(字段。您可以通过firebase.auth.auth.signInWithCredential直接使用该凭据登录来从此错误中恢复。

当然,相关链接是firebase.auth.auth.signInWithCredential.

我只是在我自己的代码中用类似的东西尝试了一下

try {
// logged in with an anon user
// try to connect via popup with 3rd part
} catch (e) {
// if code is auth already in use
firebase.auth.Auth.signInWithCredential(e.credential)
} finally {
// clean up
}

实际上,我在Flutter中遇到了同样的问题,但事实证明,不需要linkWithProvider。我最后打电话给

final appleProvider = AppleAuthProvider();
appleProvider.addScope('email');
await FirebaseAuth.instance.currentUser
?.reauthenticateWithProvider(appleProvider)
.then((UserCredential credential) async {
// Firebase seems to handle the rest
});

不确定这是否是有意的,因为它在任何地方都没有记录,但它似乎确实起到了作用。

最新更新