我正致力于使用GitHub身份验证提供程序将匿名用户转换为永久用户。
我的想法是,在我的应用中,用户始终会自动验证为匿名用户。然后,当他们点击“使用GitHub登录”按钮时,基本上会发生什么,我的应用程序首先尝试将该匿名用户链接到GitHub凭据(这基本上是同时登录),但如果链接失败,用户已经存在(例如之前已经链接过),它会使用GitHub恢复正常登录。
我使用firebase的API linkWithPopup(provider)
和signInWithPopup(provider)
。这两种方法都返回一个使用经过身份验证的GitHub用户解析的promise,这很棒!但是,事实证明我从linkWithPopup()
获得的用户对象没有设置photoUrl
属性。它总是null
。
当我signInWithPopup()
直接离开,甚至没有尝试链接时,我也会得到一个使用用户对象解决的承诺,并且这个 设置了photoUrl
。所以看起来linkWithPopUp()
中存在一个错误。
这是一个已知问题,还是这种预期行为?
我的代码如下所示:
linkOrSignInWithGitHub(): Observable<User> {
let linkPromise = firebase.auth()
.currentUser
.linkWithPopup(new firebase.auth.GithubAuthProvider())
.then(result => result.user);
// If a user has been permanentely linked/authenticated already and tries
// to link again, firebase will throw an error. That's when we know that
// user credentials do already exist and we can simply sign in using GitHub.
return Observable.fromPromise(<Promise<any>>linkPromise).catch(error => this.signInWithGitHub());
}
signInWithGitHub()
看起来像这样:
signInWithGitHub(): Observable<User> {
let loginPromise = firebase.auth()
.signInWithPopup(new firebase.auth.GithubAuthProvider())
.then(result => result.user);
return Observable.fromPromise(<Promise<any>>loginPromise);
}
同样,代码本身也非常合适,只是在使用photoURL
时我没有得到用户linkWithPopup()
。
答案 0 :(得分:3)
linkWithPopup不会修改现有的顶级属性(currentUser.email,currentUser.displayName,currentUser.photoURL等)。它只会在currentUser.providerData中添加一个新的providerData对象,以及您链接的相应providerData。 如您所知,顶级数据会在注册时设置。
您可以在linkWithPopup结算后手动使用该提供程序的数据更新顶级数据。
currentUser.updateProfile({
photoURL: currentUser.providerData[indexOfGitHub].photoURL
}