私は小さな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...
_メソッドの1つを呼び出すときに起こります(もちろん、ユーザーを正常に認証した場合のみ)。
ref.unauth();
を呼び出すと、そのトークンはローカルストレージからすぐに削除されます。
適切に実装されたフローは、ユーザーが[戻る]ボタンを押したときに自動的に再認証されませんが、実装するフローによって異なります(質問にはないため、とにかくコードが多すぎます)。
Firebase docsから
https://firebase.google.com/docs/auth/Android/custom-auth
これを呼び出すFirebaseAuth.getInstance().signOut();
ログアウト後のバックボタンに関する問題には、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コーディングなので、間違っている場合は修正してください。
finish()
をfinishAffinity();
に置き換えることができます
トークンとインスタンス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();