在Android中的Firebase Google身份验证中,首次检查用户是否首次通过身份验证

时间:2016-09-17 18:10:18

标签: android firebase firebase-authentication

我在Android应用程序中使用Firebase身份验证,我使用Google帐户身份验证作为登录该应用程序的选项。

我如何知道用户是否第一次登录该应用程序?

9 个答案:

答案 0 :(得分:24)

要检查用户是否第一次登录,只需在AdditionalUserInfo.isNewUser()回调中调用OnCompleteListener.onComplete方法。

下面的示例代码,请务必检查是否为空。

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"));
            }
        }
    };

查看文档以获取更多参考{{3}}

答案 1 :(得分:5)

Firebase-ui docs,您可以检查创建时间戳的最后登录时间戳,如下所示:

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.
}

答案 2 :(得分:4)

根据新版本的 Firebase身份验证(16.0.1),AuthResult类具有一个成员函数,其结果为true或false(如果用户是新用户)。 假设在范围(它是google凭据)中定义了“凭据” 。一个例子如下所示: `

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();

                    }


            });

感谢firebase:)

答案 3 :(得分:2)

从版本11.6.0开始,我们可以使用AdditionalUserInfo.isNewUser()

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

答案 4 :(得分:1)

将Firebase Auth与Firestore一起使用时的解决方案

Firestore数据库的根体系结构如下所示 enter image description here

使用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")
        }
    }
}

答案 5 :(得分:0)

答案 6 :(得分:0)

虽然我完全同意最正确的方法(鉴于无法在auth用户表中添加新字段)是为用户创建新路径并在那里存储信息,但我并不想做额外的登录后请求执行此检查(我使用Firestore和请求=金钱)。

我需要先进行首次登录检查以提示输入userName(因为显示名称是从Facebook / Google中提取的,我想在第一次登录时提供覆盖选项)。我最终做的是使用photoURL属性作为标志来确定它是否是他们的第一次。它并不理想,但也许有人想要节省请求可以使用它作为一种解决方法。对于Firebase来说,这不是什么大不了的事,但对于Firestore来说,它对你的计划来说成本更高

答案 7 :(得分:0)

在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
            }
        }
    }

答案 8 :(得分:0)

首先检查 - 如果当前用户 uid 与您的文档 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;
}