web-dev-qa-db-ja.com

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

これは思ったとおりに機能しますか?明らかに、誰かがログアウトしても、戻るボタンを押して再ログインせずに魔法のように最後のページに戻ることはできません。

23
John

Firebaseがユーザーを認証する(またはFirebaseでユーザーを認証する)と、そのユーザーのトークンがデバイスのローカルストレージに保存されます。これは、_authWith..._メソッドの1つを呼び出すときに起こります(もちろん、ユーザーを正常に認証した場合のみ)。

ref.unauth();を呼び出すと、そのトークンはローカルストレージからすぐに削除されます。

適切に実装されたフローは、ユーザーが[戻る]ボタンを押したときに自動的に再認証されませんが、実装するフローによって異なります(質問にはないため、とにかくコードが多すぎます)。

13

Firebase docsから

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

これを呼び出すFirebaseAuth.getInstance().signOut();

24

ログアウト後のバックボタンに関する問題には、2つのオプションがあります。

LoginActivityで、ランチャーアクティビティである必要があります。onBackPressedメソッドをオーバーライドし、空のままにします。

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

または、ユーザー== 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週間のIMコーディングなので、間違っている場合は修正してください。

6
Daniel Szy

finish()finishAffinity();に置き換えることができます

1

トークンとインスタンス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();
0
Ebin Joy