2017-03-13 15 views
4

私はGitHub認証プロバイダを使用して匿名ユーザーを常設ユーザーに変換する実装に取り​​組んでいます。firebaseのlinkWithPopup()がfirebaseのユーザ `photUrl`を設定しないのはなぜですか?

私のアプリでは、ユーザーは常に自動的に匿名ユーザーとして認証されます。次に、「GitHubでログイン」ボタンをクリックすると、基本的には、私のアプリはまずその匿名ユーザーをGitHubの資格情報(基本的には同時にサインイン)にリンクしようとしますが、リンクが失敗した場合ユーザーはすでに存在しています(例えば、以前にリンクされていた)場合、GitHubを使用して通常のサインインに戻ります。

firebaseのAPI linkWithPopup(provider)signInWithPopup(provider)を使用します。両方のメソッドは、認証されたGitHubユーザで解決する約束を返します。これは素晴らしいことです!しかし、linkWithPopup()から取得したユーザオブジェクトにはphotoUrlプロパティが設定されていないことが判明しました。それは常にnullです。 IすぐsignInWithPopup()が、でもリンクしようとせずに、私も約束はユーザーオブジェクトと、この1 で解決を取得

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()です。

答えて

3

linkWithPopupは、既存のトップレベルの属性(currentUser.email、currentUser.displayName、currentUser.photoURLなど)を変更しません。これは、currentUser.providerDataに新しいproviderDataオブジェクトを追加し、それにリンクした対応するproviderDataのみを追加します。 トップレベルのデータは、すでに気付いているようにサインアップ時に設定されます。

linkWithPopupの解決後に、プロバイダのデータを手動で使用してトップレベルのデータを手動で更新できます。 currentUser.updateProfile({ photoURL: currentUser.providerData[indexOfGitHub].photoURL }

関連する問題