Gur*_*Rao 4 firebase firebase-authentication angularfire2 google-cloud-firestore
我正在构建一个应用程序,其中用户可以匿名登录,稍后可以选择使用 Google 或 facebook 登录。我已按照firebase 网站和这篇文章中提到的步骤进行操作,但仍然收到错误消息 -
代码:“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(() => {
});
}
}
Run Code Online (Sandbox Code Playgroud)
正如其他帖子中提到的那样,我使用了linkWithCredential传递 required 的方法idToken/accessToken,但无法链接两个提供商上的帐户,因此最终在Authentication-> Users下创建多个帐户。
谁能指出我正确的方向,还是我在这里遗漏了什么?
如果您收到auth/provider-already-linked错误代码,则意味着您已经将提供商链接到该用户。您只能链接提供商一次。同一用户不能拥有多个 Facebook 帐户。只有一次。如果您想删除该帐户,则必须取消其链接:firebase.auth().currentUser.unlink(firebase.auth.FacebookAuthProvider.PROVIDER_ID)。然后,您可以将新的 Facebook 凭据链接到该用户。
| 归档时间: |
|
| 查看次数: |
5120 次 |
| 最近记录: |