You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集成Google认证后如何阻止新注册账户自动登录?

问题:集成Google认证后新注册账户自动登录的修复方案

我的应用同时支持常规邮箱注册与Google认证功能。原本常规注册功能运行正常,新注册用户不会自动登录;但集成Google认证代码后,即便登录页面存在校验逻辑,新注册的账户仍会被自动登录,请问该如何修复?

常规登录代码

private void userLogin() {
    String emailtxt = email.getText().toString().trim();
    String passwordtxt = pass.getText().toString().trim();

    if(emailtxt.isEmpty()){
        email.setError("Email is required!");
        email.requestFocus();
        return;
    }

    if(!Patterns.EMAIL_ADDRESS.matcher(emailtxt).matches()){
        email.setError("Please enter a valid email!");
        email.requestFocus();
        return;
    }

    if(passwordtxt.isEmpty()){
        pass.setError("Password is required!");
        pass.requestFocus();
        return;
    }

    if(passwordtxt.length() < 6){
        pass.setError("Minimum password length is 6 characters!");
        pass.requestFocus();
        return;
    }


    mAuth.signInWithEmailAndPassword(emailtxt, passwordtxt).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(task.isSuccessful()){
                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                //redirect to user profile

                if(user.isEmailVerified()) {
                    startActivity(new Intent(login.this, MainActivity.class));

                }
                else{
                    user.sendEmailVerification();
                    Toast.makeText(login.this, "Please check your email to verify your account", Toast.LENGTH_LONG).show();
                }
            }
            else{
                Toast.makeText(login.this, "Try again! The email/password you provided does not match any of our records", Toast.LENGTH_LONG).show();
            }
        }
    });
}

Google认证代码

private void checkUser() {
    //if user is already signed in then go to profile activity
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    if (firebaseUser != null){
        Log.d(TAG, "checkUser: Already logged in");
        startActivity(new Intent(this, MainActivity.class));
        finish();
    }
}

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

    if(requestCode == RC_SIGN_IN){
        Log.d(TAG, "onActivityResult: Google Signin intent result");
        Task<GoogleSignInAccount> accountTask = GoogleSignIn.getSignedInAccountFromIntent(data);
        try {
            //google sign in success,
            GoogleSignInAccount account = accountTask.getResult(ApiException.class);
            firebaseAuthWithGoogleAccount(account);
        } catch (Exception e) {
            Log.d(TAG, "onActivityResult: "+e.getMessage());
        }
    }
}

private void firebaseAuthWithGoogleAccount(GoogleSignInAccount account) {
    Log.d(TAG, "firebaseAuthWithGoogleAccount: begin firebase auth with google account");
    AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
    firebaseAuth.signInWithCredential(credential).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                @Override
                public void onSuccess(AuthResult authResult) {
                    //login success
                    Log.d(TAG, "onSuccess: Logged In");

                    //get logged in user
                    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
                    //get user info
                    String uid = firebaseUser.getUid();
                    String email = firebaseUser.getEmail();

                    Log.d(TAG, "onSuccess: Email: "+email);
                    Log.d(TAG, "onSuccess: UID: "+uid);

                    //check if user is new or existing
                    if(authResult.getAdditionalUserInfo().isNewUser()){
                        //user is new account created
                        Log.d(TAG, "onSuccess: Account Created...\n"+email);
                        Toast.makeText(login.this, "Account Created...\n"+email, Toast.LENGTH_LONG).show();
                    }
                    else{
                        //existing user - logged in
                        Log.d(TAG, "onSuccess: Existing user...\n"+email);
                        Toast.makeText(login.this, "Existing user...\n"+email, Toast.LENGTH_SHORT).show();

                    }
                    startActivity(new Intent(login.this, MainActivity.class));
                    finish();

                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    //login failed
                    Log.d(TAG, "onFailure: Login Failed "+e.getMessage());

                }
            });
}

修复方案

问题根源

Firebase的signInWithCredential(Google认证)会自动完成用户登录,而你的Google认证成功回调中,无论新老用户都直接跳转主页面;同时页面初始化时的checkUser方法会检测当前登录状态,导致新注册用户被自动跳转。

具体修复步骤

  1. 修改Google认证的成功回调逻辑
    对新创建的Google账户,在注册完成后立即登出,避免自动登录状态被checkUser检测到:

    @Override
    public void onSuccess(AuthResult authResult) {
        Log.d(TAG, "onSuccess: Logged In");
    
        FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
        String uid = firebaseUser.getUid();
        String email = firebaseUser.getEmail();
    
        Log.d(TAG, "onSuccess: Email: "+email);
        Log.d(TAG, "onSuccess: UID: "+uid);
    
        if(authResult.getAdditionalUserInfo().isNewUser()){
            Log.d(TAG, "onSuccess: Account Created...\n"+email);
            Toast.makeText(login.this, "账户创建成功,请手动登录", Toast.LENGTH_LONG).show();
            // 新用户创建后立即登出,清除登录状态
            firebaseAuth.signOut();
        }
        else{
            Log.d(TAG, "onSuccess: Existing user...\n"+email);
            Toast.makeText(login.this, "登录成功", Toast.LENGTH_SHORT).show();
            startActivity(new Intent(login.this, MainActivity.class));
            finish();
        }
    }
    
  2. 统一常规注册逻辑(如果需要)
    若常规注册流程使用createUserWithEmailAndPassword,同样需要在注册成功后登出,保持逻辑一致:

    // 示例常规注册代码
    mAuth.createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                Toast.makeText(RegisterActivity.this, "注册成功,请登录", Toast.LENGTH_SHORT).show();
                mAuth.signOut(); // 注册后登出
                startActivity(new Intent(RegisterActivity.this, login.class));
                finish();
            } else {
                Toast.makeText(RegisterActivity.this, "注册失败: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    

核心逻辑

Firebase的注册/认证接口默认会将用户设置为已登录状态,要实现"注册后不自动登录",必须在注册成功后立即调用signOut()清除当前登录会话,确保checkUser方法检测不到已登录用户,从而停留在登录页面。

内容的提问来源于stack exchange,提问作者caspernim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:58:32