2016-09-17 7 views
12

AndroidアプリケーションでFirebase認証を使用しており、Googleアカウント認証をオプションとして使用してアプリケーションにサインインしています。ユーザーがFirebaseで初めて認証されたかどうかを確認する

ユーザーが最初にアプリケーションにログインしているかどうかを確認するにはどうすればよいですか?

ご協力いただきありがとうございます。

+0

だからFirebase認証を使用するすべてのユーザーのリストを取得使いたいですか? –

+0

はいそれは私が探しているものです – rainman

+0

残念ながら、Firebase Authはそのようには使用できません。 @NarenderReddyの説明に従わなければならないでしょう - ユーザーが初めてログインするたびに、Firebaseデータベース(または好みの保存方法)を使用して、追跡したい情報と共に何らかのエントリを保存する必要があります。その後、そのデータベースの場所を使用してすべてのユーザーのリストを取得できます。 –

答えて

0

これは、あなたを助け、それを試してください:

Correct code location to check Firebase if a user has been created already?

+0

私は私の質問を編集しました – rainman

+0

私は編集しました私の答えはそれを見てください –

+1

@adityashrivastavaあなたのSOの質問は、ユーザーが設定したFirebaseデータベース(リアルタイムデータベース)を指します。 Firebase(認証)でしか解決できないようにしたいと思っています。 – Lobato

-1

初めてのユーザーのサインアップは、パスワードをリセットするために彼を頼むとき。 あなたが.. sendPasswordResetEmail方法でユーザーに リンクパスワードリセットのメールを送ることができますし、ユーザーパスワードのオプションをリセットし、新しい資格とパスワードとログインを変更し、ユーザーが間違ったメールIDを与えるならば、彼はできません取得をhttps://firebase.google.com/docs/auth/android/manage-users

をログイン..

+0

ユーザが最初にサインインしているかどうかをチェックしたいのですが、そうではありません。 私は何もリセットしたくありません。 – rainman

+0

firebase realtime database.whenを使用してユーザのログインをルートノードにする –

+0

私はすでにこの方法を考えていましたが、Firebase Authコンソールではあなたのアプリケーションに登録されているすべてのユーザを見ることができます。例... – rainman

1

ソリューションあなたはFirestoreと一緒Firebase認証を使用

Firestoreデータベースのルート・アーキテクチャは、この enter image description here

ようになります。

Firebase Auth currentUser.uidを使用して、各ユーザのルートドキュメントを作成します。最初にユーザーが作成されるとすぐにregistered_atというフィールドをルートドキュメントに追加し、ユースケースに応じて特定のコレクションをルートドキュメントに追加します。

ログインまたはサインインするときに、registered_atフィールドの文書がすでに存在するかどうかを確認できます。それはまだ存在していない場合は、私は完全に最も正しい方法は、(与えられたことに同意しますが、あなたは

import com.google.firebase.auth.FirebaseAuth 
import com.google.firebase.firestore.DocumentReference 
import com.google.firebase.firestore.FirebaseFirestore 

fun rootDocument(): DocumentReference? = rootPath()?.let { 
    return fireStore().document(it) 
} 

fun rootPath(): String? { 
    val loggedInUser = loggedInUser() 
    if (loggedInUser != null) { 
     return "users/${loggedInUser.uid}" 
    } 
    return null 
} 

fun fireStore() = FirebaseFirestore.getInstance() 

fun createWriteBatch() = fireStore().batch() 

fun loggedInUser() = fireAuth().currentUser 

fun fireAuth(): FirebaseAuth = FirebaseAuth.getInstance() 

fun afterSignIn() { 

    val rootDocument = rootDocument() 
      ?: throw IllegalStateException("root document not found") 

    rootDocument.get().addOnCompleteListener { 
     val isNewUser = it.result.exists().not() 

     if (isNewUser) { 
      val batch = createWriteBatch() 

      batch.set(rootDocument, HashMap<Any, Any>().apply { 
       put("registered_at", System.currentTimeMillis()) 
      }) 

      batch.commit().addOnCompleteListener { 
       println("this is a new user") 
      } 

     } else { 
      println("this is not a new user") 
     } 
    } 
} 
0

(削除以降registered_atフィールドを変更することはできませんユーザーを想定して)新しいユーザーとしてユーザーを扱うことができますauthユーザーテーブルに新しいフィールドを追加することができないということは、ユーザーの新しいパスを作成してそこに情報を格納することです。このチェックを行うためにログインした後で追加の要求をしたくありませんでした(Firestoreとリクエスト=お金)。

私はこの最初のログインチェックでuserNameのプロンプトを表示する必要がありました(表示名はFacebook/Googleから取得され、最初のログインであれば上書きするオプションを与えたいと思っていました)。私がやったことは、photoURLプロパティをフラグとして使用して初めてかどうかを判断することでした。理想的ではありませんが、要求を保存したい人は、これを回避策として使用できます。これは、我々はそれがで初めてのユーザがログインするのですかどうかを確認するにはAdditionalUserInfo.isNewUser()

https://firebase.google.com/docs/reference/android/com/google/firebase/auth/AdditionalUserInfo

0

OnCompleteListener.onCompleteコールバックでAdditionalUserInfo.isNewUser()メソッドを呼び出すだけです。

以下のコード例では、nullを確認してください。

OnCompleteListener<AuthResult> completeListener = new OnCompleteListener<AuthResult>() { 
     @Override 
     public void onComplete(@NonNull Task<AuthResult> task) { 
      if (task.isSuccessful()) { 
       boolean isNew = task.getResult().getAdditionalUserInfo().isNewUser(); 
       Log.d("MyTAG", "onComplete: " + (isNew ? "new user" : "old user")); 
      } 
     } 
    }; 

AdditionalUserInfoクラスのリファレンス
https://firebase.google.com/docs/reference/android/com/google/firebase/auth/AdditionalUserInfo

2

を使用することができ、バージョン11.6.0からFirebase用として大したことではないのですが、Firestoreのために、それはあなたの計画のためのより高価だ

関連する問題