2017-03-26 25 views
1

firebase認証とfirebaseデータベースを使用していますが、私はfbとgoogleでログインするすべての新規ユーザーを登録したいと思います。これは私がログインするために使用するコードです:facebookとgoogle経由のログイン

FBログイン

// [START auth_with_facebook] 
private void handleFacebookAccessToken(AccessToken token) { 
    Log.d(TAG, "handleFacebookAccessToken:" + token); 
    // [START_EXCLUDE silent] 
    showProgressDialog(); 
    // [END_EXCLUDE] 

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken()); 
    mAuth.signInWithCredential(credential) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful()); 

        // If sign in fails, display a message to the user. If sign in succeeds 

        // signed in user can be handled in the listener. 
        if (!task.isSuccessful()) { 
         Log.w(TAG, "signInWithCredential", task.getException()); 
         Toast.makeText(MainActivity.this, "Authentication failed.", 
           Toast.LENGTH_SHORT).show(); 
        } 

        // [START_EXCLUDE] 
        hideProgressDialog(); 
        // [END_EXCLUDE] 
       } 
      }); 
} 
// [END auth_with_facebook] 

グーグル

// [START auth_with_google] 
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
    Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId()); 
    // [START_EXCLUDE silent] 
    showProgressDialog(); 
    // [END_EXCLUDE] 

    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
    mAuth.signInWithCredential(credential) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful()); 

        // If sign in fails, display a message to the user. If sign in succeeds 

        if (!task.isSuccessful()) { 
         Log.w(TAG, "signInWithCredential", task.getException()); 
         Toast.makeText(MainActivity.this, "Authentication failed.", 
           Toast.LENGTH_SHORT).show(); 
        } 
        // [START_EXCLUDE] 
        hideProgressDialog(); 
        // [END_EXCLUDE] 
       } 
      }); 
} 
// [END auth_with_google] 

これらすべてのコードは、私のmainActivityであるので、私はまた、認証リスナーを作成します。

// [START auth_state_listener] 
    mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      FirebaseUser user = firebaseAuth.getCurrentUser(); 
      if (user != null) { 
       // User is signed in, 
       // I WANT TO CHECK AND REGISTER NEW USER HERE 



       Intent home = new Intent(MainActivity.this , HomeActivity.class); 
       startActivity(home); 
       Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 
      } else { 
       // User is signed out 
       Log.d(TAG, "onAuthStateChanged:signed_out"); 
      } 
      // [START_EXCLUDE] 

      updateUI(user); 



      // [END_EXCLUDE] 
     } 
    }; 

私はまだあなたが既に登録されているかどうかを確認する方法がわからない、多分何かのように、前に登録された電子メールを意味するので、私はユーザーの電子メールを持っているノードがあるかどうかを確認します。まだ登録されていない場合は、その後、私は例えば、プッシュ呼び出すことができます。

String userId = mDatabase.push().getKey(); 
mDatabase.child(userId).setValue(Newuser); 
+0

各ユーザーが一意のユーザー名または電子メールアドレスを持つようにするには、username/emailからデータベースのuidへのマッピングを格納します。 http://stackoverflow.com/questions/35243492/firebase-android-make-username-uniqueおよびhttp://stackoverflow.com/questions/25294478/how-do-you-prevent-duplicate-user-properties-inを参照してください。 - firebase –

答えて

2

firebase内のすべてのユーザーは、ユーザーが以前に署名されたかどうかを識別するために使用することができます彼のユニークなIDを持っています。

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 

そしてあなたはユーザーIDを取得することができます:あなたはこの

{ 
    "users": { 
    "userId": { 
     "name": "User Name", 
     ... 
    } 
    }, 
} 
のようにそのIDを使用してfirebaseデータベース内のユーザーを保存する場合

String userId = user.getUid(); 

をあなたはFirebaseUserインスタンスを取得することができますサインインした後 ログイン後に

のユーザーが既にデータベースに存在するかどうかを確認できます。

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
rootRef.child("users").addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    void onDataChange(DataSnapshot snapshot) { 
    if (snapshot.hasChild(userId)) { 
     // user already exists in db 
    } 
    } 
}); 
+0

ありがとう、しかし、ユーザーがログインし、最初に電子メールパスワードで登録してから、再度Facebookにログインしようとするとどうなりますか? –

+0

ユーザーが電子メールで登録されてから、同じ電子メールでfacebookまたはgoogle経由でログインすると、それらのアカウントはfirebaseでリンクされ、ユーザーは同じアカウントでログインします。 Firebaseコンソールのタブプロバイダの認証セクションで確認できます。また、user.getProviders()を呼び出すことでプログラムで確認することもできます。ユーザーが電子メール/パスワードで登録されている場合user.getProviders()は1つのプロバイダ "password"を持つリストを返します。それらのアカウントはリンクされ、プロバイダーの "password"と "facebook.com"を取得します – dzikovskyy

+0

あなたの明確な説明をいただきありがとうございます。 –

関連する問題