从Android应用

时间:2016-02-21 20:34:42

标签: android firebase firebase-authentication

我正在开发一个小型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();
}        

我认为这应该可行吗?显然,如果有人退出,他们应该无法点击后退按钮并神奇地返回到最后一页而无需重新登录。

6 个答案:

答案 0 :(得分:20)

来自Firebase文档

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

拨打此FirebaseAuth.getInstance().signOut();

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:5)

我在登出后看到后退按钮的问题有2个选项:

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

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

或/并且如果user == null,您可以在LogoutActivty中添加LoginActivityIntent。 这样,只要未经过身份验证的用户登陆该活动,它就会立即重定向到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周,所以如果我错了,请纠正我。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

删除令牌和实例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();

答案 5 :(得分:-1)

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

此代码的编写方式是复制过去的内容,只需阅读代码中的评论即可根据您的需要对其进行自定义,我更喜欢让用户登录