我阅读了使用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
});
不确定这是否是有意的,因为它在任何地方都没有记录,但它似乎确实起到了作用。