2

を再読み込みした後のFirebaseの自動ログインParseを使用していたときに、SDKがセッションデータをローカルに保存するように見えて、ページを更新した後に再度ログインする必要はありませんでしたアプリ)。これはFirebase/Angularfireの場合とは違います。毎回私のWebページを更新するたびに、認証データが大量になります。これは本当に基本的で重要な機能のようだが、Firebaseの素晴らしい人たちは実装されていないことに驚くだろう。何か不足していますか?Ionic app/page

完全性のために;ここに私のコードは)(app.runである:

// ASG june 2016 - Upgrade firebase SDK 
firebase.initializeApp(FirebaseConfig); 

// login as anonymous if not already logged in 
var currentUser = $firebaseAuth().$getAuth(); 
if (currentUser) { 
    console.log("Signed in as:", currentUser); 
} else { 
    console.log("Not logged in; going to log in as anonymous"); 
    $firebaseAuth().$signInAnonymously().then(function(authData) { 
     console.log("Signed in anonymously as:", authData.uid); 
    }).catch(function(error) { 
     console.error("Anonymous authentication failed:", error); 
    }); 
} 

// register the on auth callback 
$firebaseAuth().$onAuthStateChanged(function(authData) { 
    if (authData) { 
     console.log("Logged in as:", authData.uid); 
     if(typeof($rootScope.userProfile) == "undefined"){ 
      $rootScope.userProfile = FirebaseProfileService.getUserProfile(authData.uid, false); 
     } 
    } 
}); 

答えて

1

authトークンは、ページ/アプリのリロードの間に保持されます。しかし、ページがリロードされると、新しいリフレッシュトークンを取得する必要があります。これはFirebaseサーバへの往復を必要とします。これには時間がかかるので、最初のgetAuth()はそのプロセスが進行中の間にnullを返すことがあります。

var currentUser; 

$firebaseAuth().$onAuthStateChanged(function(authData) { 
    if (authData) { 
     console.log("Logged in as:", authData.uid); 
     currentUser = authData.currentUser; 
     if(typeof($rootScope.userProfile) == "undefined"){ 
      $rootScope.userProfile = FirebaseProfileService.getUserProfile(authData.uid, false); 
     } 
    } 
    else { 
     console.log("Not logged in; going to log in as anonymous"); 
     currentUser = null; 
     $firebaseAuth().$signInAnonymously().catch(function(error) { 
      console.error("Anonymous authentication failed:", error); 
     }); 
    } 
}); 
2

Firebaseは絶対にauthDataをpresists、あなたがほとんど他の場所で見つけることの良さをたくさん持っています。したがって、onAuthStateChangedリスナーからauthDataを簡単に取得できるので、ここでgetAuth()を呼び出す背後に論理的な理由はありません。この場合、getAuth()を使用してcurrentUserを取得する操作を削除し、ELSE条件をonAuthStateChangedに移動する必要があります。AuthDataが見つからない場合にユーザーを匿名で登録し、私は願います。それがうまくいくことを望みます。

+0

getAuthを使用せずに現在ログインしているユーザーに関するデータを取得するにはどうすればよいですか?ユーザーがログインしているかどうかをチェックしたい他の州では? – rex

+0

私は、ユーザーが既にログインしていて、このデータが永続化されている場合、getAuthがnullを返すのはちょっとわかりません。 – rex

+0

私はそれはあなたがapp.run()に入れて競合状態に陥ることがあるからだと思いますが、別のコントローラとサービスが取り組む異なる州ではうまく動作します。繰り返しますが、私はちょうど考えて、私の側からは何もテストされていないと推測しています。しかし、試して、私に知らせてください。 –