集成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方法会检测当前登录状态,导致新注册用户被自动跳转。
具体修复步骤
修改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(); } }统一常规注册逻辑(如果需要)
若常规注册流程使用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
相关产品推荐
相关产品推荐

