为什么firebase的linkWithPopup()没有在firebase中设置用户`photoUrl`?

时间:2017-03-13 14:43:00

标签: firebase firebase-authentication

我正致力于使用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()

1 个答案:

答案 0 :(得分:3)

linkWithPopup不会修改现有的顶级属性(currentUser.email,currentUser.displayName,currentUser.photoURL等)。它只会在currentUser.providerData中添加一个新的providerData对象,以及您链接的相应providerData。 如您所知,顶级数据会在注册时设置。

您可以在linkWithPopup结算后手动使用该提供程序的数据更新顶级数据。 currentUser.updateProfile({ photoURL: currentUser.providerData[indexOfGitHub].photoURL }