我正在构建一个应用程序,其中用户可以匿名登录,之后可以选择使用Google或Facebook登录。我已按照 firebase site 和 this post 中提到的步骤进行了操作,但仍然收到错误,内容为 -
代码:“auth / provider-already-linked”,
消息:“用户只能是 链接到给定提供者的一个身份。“
以下是 auth.service.ts 内容
@Injectable()
export class AuthService {
user: Observable<User>;
constructor(private afAuth: AngularFireAuth,
private afs: AngularFirestore,
private router: Router) {
this.user = this.afAuth.authState
.switchMap(user => {
if (user) {
return this.afs.doc<User>(`usersData/${user.uid}`).valueChanges()
} else {
return Observable.of(null)
}
});
}
anonymousLogin(): Promise<any>{
return this.afAuth.auth.signInAnonymously();
}
get authState(): Observable<User>{
return this.afAuth.authState.map(data => {
return data;
});
}
get currentUser(): boolean {
return this.user !== null;
}
getCurrentUser(): User{
return this.afAuth.auth.currentUser;
}
googleLogin() {
const provider = new firebase.auth.GoogleAuthProvider()
return this.oAuthLogin(provider);
}
facebookLogin(){
const provider = new firebase.auth.FacebookAuthProvider();
provider.setCustomParameters({
'display': 'popup'
});
return this.oAuthLogin(provider);
}
private oAuthLogin(provider) {
return this.afAuth.auth.signInWithPopup(provider)
.then((response) => {
if(this.getCurrentUser() !== null){
let cred = null;
if(response.credential.providerId === 'google.com'){
cred = firebase.auth.GoogleAuthProvider
.credential(response.credential.idToken);
}else if(response.credential.providerId === 'facebook.com'){
cred = firebase.auth.FacebookAuthProvider
.credential(response.credential.authToken);
}
firebase.auth().currentUser
.linkWithCredential(cred).then(function(user) {
console.log("Anonymous account successfully upgraded", user);
}, function(error) {
console.log("Error upgrading anonymous account", error);
});
}
this.updateUserData(response.user)
});
}
private updateUserData(user) {
const userRef: AngularFirestoreDocument<any> = this.afs.doc(`usersData/${user.uid}`);
const data: User = {
uid: user.uid,
email: user.email,
displayName: user.displayName,
photoURL: user.photoURL,
isAnonymous: user.isAnonymous,
roles: {
customer: true
}
};
return userRef.set(data, {merge: true});
}
signOut() {
this.afAuth.auth.signOut().then(() => {
});
}
}
正如其他帖子中提到的那样,我已经使用linkWithCredential
方法传递了必需的idToken/accessToken
但是它无法链接两个提供商的帐户,因此最终在身份验证下创建了多个帐户 - &GT;用户
有人可以指出我正确的方向还是我错过了什么?
答案 0 :(得分:1)
您可以轻松地将匿名身份验证用户转换为paermanent帐户。
查看文档here了解更多详情。我相信为了实现这一点,您必须修改您的身份验证设置,以允许用户从多个帐户登录。
答案 1 :(得分:1)
如果您收到auth/provider-already-linked
错误代码,则表示您已将提供商与该用户相关联。您只能链接一次提供商。您不能为同一个用户拥有多个Facebook帐户。只有一次。如果您要删除该帐户,则必须取消其关联:firebase.auth().currentUser.unlink(firebase.auth.FacebookAuthProvider.PROVIDER_ID)
。
然后,您可以将新的Facebook凭据链接到该用户。