programing

Android의 Firebase Google Authentication에서 사용자가 처음으로 인증되었는지 확인합니다.

abcjava 2023. 6. 5. 23:30
반응형

Android의 Firebase Google Authentication에서 사용자가 처음으로 인증되었는지 확인합니다.

안드로이드 앱에서 파이어베이스 인증을 사용하고 있으며, 앱에 로그인하기 위한 옵션으로 구글 계정 인증을 사용하고 있습니다.

사용자가 애플리케이션에 처음 로그인했는지 여부를 어떻게 알 수 있습니까?

사용자가 처음으로 로그인하는지 여부를 확인하려면 다음 주소로 전화하십시오.AdditionalUserInfo.isNewUser()의법에 있는 OnCompleteListener.onComplete콜백

아래 코드 예제에서는 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"));
            }
        }
    };

자세한 참조는 문서를 확인하십시오.

Firebase-ui 문서에서 마지막 로그인 타임스탬프를 다음과 같이 생성된 타임스탬프와 비교하여 확인할 수 있습니다.

FirebaseUserMetadata metadata = auth.getCurrentUser().getMetadata();
if (metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp()) {
    // The user is new, show them a fancy intro screen!
} else {
    // This is an existing user, show them a welcome back screen.
}

Firebase auth(16.0.1)의 새 버전에 따르면 AuthResult 클래스에는 true 또는 false(사용자가 새로 온 것인지 여부)를 나타내는 멤버 함수가 있습니다.범위에 "credential"이 정의되어 있다고 가정합니다(Google credential).예는 아래에 나와 있습니다: '

private FirebaseAuth mAuth;

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();

mAuth = FirebaseAuth.getInstance();
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
GoogleSignInAccount acct = task.getResult(ApiException.class);
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);

mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "linkWithCredential:success");


                        boolean newuser = task.getResult().getAdditionalUserInfo().isNewUser();



                        if(newuser){

                             //Do Stuffs for new user

                         }else{

                            //Continue with Sign up 
                        }

                    } else {

                        Toast.makeText(MyClass.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();

                    }


            });

파이어베이스 덕분에:)

웹의 경우 버전 9.0(모듈형):

"getAdditionalUserInfo"를 가져와 다음과 같이 호출해야 합니다.

signInWithPopup(firebaseAuth, provider)
  .then((result) => {
    const details = getAdditionalUserInfo(result)
    console.log(details.isNewUser);
  })
  .catch((error) => {
    console.log(error);
  });

반환된 세부 정보에는 "isNewUser" 부울 속성이 포함됩니다.

2021년 8월부터 깃허브에 대한 세부사항.

11부터는 버11.6.0 사있수다를 사용할 수 .AdditionalUserInfo.isNewUser()

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

내가 사용한 해결책은...

  1. Firestore에서 '사용자'라는 이름의 컬렉션을 만들었습니다.
  2. 누군가가 로그인할 때마다, 그것의 액체를 가져와라.
  3. '사용자'에서 해당 UID를 검색합니다.'사용자' 문서의 이름을 = 사용자의 UID로 지정해야 합니다.
  4. 문서가 존재하는 경우 새 사용자, 그렇지 않은 경우
  5. 그런 다음 해당 사용자의 문서를 해당 '사용자' 컬렉션에 추가합니다.

사용된 트릭 - UID를 사용하여 이 문제를 해결합니다.감사합니다. 도움이 된다면 투표하세요.

Firebase Auth를 Firestore와 함께 사용하는 경우의 솔루션

Firestore 데이터베이스의 루트 아키텍처는 다음과 같습니다.

Auth Firebase currentUser.uid각 사용자에 대한 루트 문서를 작성합니다.다음 필드를 추가하는 것으로 시작합니다.registered_at사용자를 처음 작성하는 즉시 루트 문서에 추가한 후 사용 사례에 따라 특정 컬렉션을 루트 문서에 추가합니다.

때, 에 "" "" "" " "" " "" "가 할 수 .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")
        }
    }
}

(인증 사용자 테이블에 새 필드를 추가할 수 없는 경우) 가장 올바른 방법은 사용자를 위한 새 경로를 만들고 정보를 저장하는 것이라는 데 전적으로 동의하지만, 이 확인을 위해 로그인한 후 추가 요청을 하고 싶지 않았습니다(Firestore를 사용하고 있으며 = money를 요청합니다).

사용자 이름을 입력하라는 메시지를 표시하기 위해 이 첫 번째 로그인 검사를 수행해야 했습니다(표시 이름은 Facebook/Google에서 가져온 것이며 첫 번째 로그인일 경우 재정의하는 옵션을 제공하고 싶었기 때문입니다).제가 하게 된 것은 사진 URL 속성을 플래그로 사용하여 처음인지 아닌지를 판단하는 것이었습니다.이 방법은 이상적이지 않지만 요청 비용을 절약하려는 사용자가 이 방법을 해결 방법으로 사용할 수 있습니다.Firebase에서는 그렇게 큰 문제가 아니지만 Firestore에서는 계획에 더 많은 비용이 듭니다.

Firebase UI에서 Java:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Intent i;


        if (requestCode == RC_SIGN_IN) {
            IdpResponse response = IdpResponse.fromResultIntent(data);

            if (resultCode == RESULT_OK) {


                if(response.isNewUser()){
                Log.d(TAG, "onActivityResult: isNewUser "+response.isNewUser());
} else {

                // Successfully signed in
                }

                // ...
            } else {



//               handle error
            }
        }
    }

파이어베이스 V9(모듈형)

여기 제게 효과가 있었던 기능이 있습니다.

function isNewUser(auth) {
    let newUser;
    const metadata = auth.currentUser.metadata;
    if (metadata.creationTime == metadata.lastSignInTime) {
      newUser = true;
    } else {
      newUser = false;
    }
    return newUser;
  }

더 짧은 방법을 사용할 수 있습니다.

  function isNewUser(auth) {
    const metadata = auth.currentUser.metadata;
    return metadata.creationTime == metadata.lastSignInTime ? true : false;
  }

나는 메타데이터에서 기능을 사용하는 비슷한 것을 본 적이 있습니다.metadata.getCreationTimeStamp()하지만 그것은 저에게 효과가 없었습니다.

도움이 되길 바랍니다!

이를 통해 다음과 같은 작업을 수행할 수 있습니다.

사용자가 이미 생성된 경우 Firebase를 확인하기 위해 코드 위치를 수정하시겠습니까?

우선 확인 - 현재 사용자 ID가 문서 ID와 일치하면 이전 사용자이고 그렇지 않으면 새 사용자입니다.

private boolean isUserMatch(String currentUserId) {
    firestore.collection(COLLECTION_USER).get().addOnCompleteListener(new OnCompleteListener< QuerySnapshot >() {
        @Override
        public void onComplete(@NonNull @NotNull Task< QuerySnapshot > task) {
            if (task.isSuccessful()) {
                for (QueryDocumentSnapshot documentSnapshot : task.getResult()) {
                    if (currentUserId.equals(documentSnapshot.getId())) {
                        return;
                    }
                }
            }
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull @NotNull Exception e) {
            Log.e(TAG, "onFailure: ", e.getCause());
        }
    });
    return false;
}

언급URL : https://stackoverflow.com/questions/39550149/check-if-user-is-authenticated-for-the-first-time-in-firebase-google-authenticat

반응형