从 android 应用中正确注销用户

Properly log out a user from android app

我正在开发一个小型 android 应用程序,到目前为止它基本上只有登录和注销功能。我使用 Firebase 来存储用户数据并进行身份验证。

所以我登录正常,它会按应有的方式对用户进行身份验证,而且我已经注销了 unauthenticates 用户。但是我必须在应用程序中做些什么才能终止会话吗?

if (id == R.id.action_log_out) {
    ref.unauth(); //End user session
    startActivity(new Intent(MainActivity.this, LoginActivity.class)); //Go back to home page
    finish();
}        

这会像我认为的那样工作吗?显然,如果有人注销,他们不应该能够点击后退按钮并在不重新登录的情况下神奇地返回到最后一页。

当 Firebase 对用户进行身份验证时(或者您使用 Firebase 对用户进行身份验证),它会将该用户的令牌存储在您设备上的本地存储中。当您调用 authWith... 方法之一时会发生这种情况(当然只有当它成功验证用户身份时)。

调用 ref.unauth(); 会立即从本地存储中删除该令牌。

正确实施的流程不会在用户按下后退按钮时自动重新验证它们,但这取决于您实施的流程(您的问题中缺少该流程,并且可能代码太多)。

来自 Firebase 文档

https://firebase.google.com/docs/auth/android/custom-auth

称之为FirebaseAuth.getInstance().signOut();

删除令牌和实例 ID

String authorizedEntity = PROJECT_ID;  
String scope = "GCM";
FirebaseInstanceID.getInstance(context).deleteToken(authorizedEntity,scope);

您还可以删除实例 ID 本身,包括所有关联的令牌。下次调用 getInstance() 时,您将获得一个新的实例 ID:

FirebaseInstanceID.getInstance(context).deleteInstanceID();
String newIID = InstanceID.getInstance(context).getId();

对于注销后的后退按钮问题,我看到了 2 个选项:

在您的 LoginActivity 中,应该是您的启动器 activity,覆盖 onBackPressed 方法并将其留空:

    @Override
public void onBackPressed() {
// empty so nothing happens
}

Or/and 如果用户 == null,您可以在您的 LogoutActivty 中添加 LoginActivityIntent。 这样,无论何时未经身份验证的用户登陆 activity,它都会立即重定向到 LoginActivity,尽管这看起来有点奇怪。

        mAuth = FirebaseAuth.getInstance();
    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
                // User is signed in
                Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
            } else {
                // User is signed out
                Log.d(TAG,"onAuthStateChanged:signed_out");
                startActivity(new Intent(LogoutActivity.this, LoginActivity.class));
            }
            // ...
        }
    };

第一个选项更简单,但我想如果你在保存方面同时应用这两个选项 ^^ 我现在编码了 2 周,所以如果我错了请纠正我。

您可以将 finish() 替换为 finishAffinity();

private void sendToLogin() { //funtion
    GoogleSignInClient mGoogleSignInClient ;
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestIdToken(getString(R.string.default_web_client_id))
        .requestEmail()
        .build();
    mGoogleSignInClient = GoogleSignIn.getClient(getBaseContext(), gso);
    mGoogleSignInClient.signOut().addOnCompleteListener(/*CURRENT CLASS */.this,
        new OnCompleteListener<Void>() {  //signout Google
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                FirebaseAuth.getInstance().signOut(); //signout firebase
                Intent setupIntent = new Intent(getBaseContext(), /*To ur activity calss*/);
                Toast.makeText(getBaseContext(), "Logged Out", Toast.LENGTH_LONG).show(); //if u want to show some text
                setupIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(setupIntent);
                finish();
            }
        });
}

这段代码是为了复制过去的代码而编写的,刚刚阅读了 COMMENTS 代码以根据您的需要对其进行自定义,我更喜欢将用户发送到登录