2016-07-13 18 views
5

pod maskąFirebase Authentication State Change nie ognia, gdy użytkownik jest wyłączone lub usunięte

Używam Firebase uwierzytelniania w moim Android app do podpisania w górę/w użytkowników korzystających z Google, Facebook i e-mail/hasło . Jak dotąd prawie wszystko działa dobrze, z wyjątkiem jednego scenariusza.

Scenariusz

muszę wyłączyć lub usuwać kont użytkowników z konsoli Firebase czasami zakazać niektórych użytkowników mojej aplikacji.

W takim przypadku, po wyłączeniu lub usunięciu tego konkretnego użytkownika, użytkownik musi natychmiast uzyskać wylogowanie z aplikacji i nie powinien mieć możliwości dalszego korzystania z niego.

Bug

Użyłem AuthStateListener do nasłuchiwania zmian stanu uwierzytelniania i wylogowanie użytkownika, automatycznie, jak tylko ich konto jest wyłączone lub usunięte.

FirebaseAuth.getInstance().addAuthStateListener(firebaseAuth -> { 
      if (firebaseAuth.getCurrentUser() == null) { 
       Intent intent = AuthFlowActivity.getCallingIntent(AuthFlowActivity.FORCE_LOGOUT); 
       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
       startActivity(intent); 
       activityExitAnimation(BaseAppActivity.this); 
      } 
     }); 

Ale nigdy nie widziałem, aby AuthStateListener wywołał jakiekolwiek zdarzenia związane z tymi działaniami. Nie mogę natychmiast wylogować użytkownika, a użytkownik nadal może korzystać z aplikacji.

Byłbym wdzięczny, jeśli ktoś może pomóc w rozwiązaniu tego problemu.

Odpowiedz

11

Wyłączenie lub usunięcie konta użytkownika nie powoduje zmiany stanu autoryzacji. Nie powinno tak być, użytkownik nadal jest uwierzytelniany. W nie więcej niż godzinie uwierzytelnianie Firebase będzie próbowało odświeżyć token dostępu dla użytkownika. Odświeżenie zakończy się niepowodzeniem, w którym to momencie użytkownik stanie się nieuwierzytelniony, a zdarzenie zmiany stanu uwierzytelnienia zostanie uruchomione.

Jeśli chcesz natychmiast unieważnić autoryzację użytkownika , musisz to zrobić w innej części logiki aplikacji. Typowym sposobem na to jest posiadanie czarnej listy w aplikacji, np. w Firebase Database:

/bannedUsers 
    uidOfBannedUser: true 

Teraz po usunięciu/wyłączenie konta użytkownika w panelu Autentykacja, można również dodać swój UID do listy zbanowanych użytkowników w bazie danych.

Baza danych można następnie zabezpieczyć przed dostępem od nieautoryzowanych użytkowników poprzez dodanie klauzuli do numeru database security rules, np.

{ 
    "rules": { 
    "bannedUsers": { 
     ".read": true, 
     ".write": false // only admins can write these 
    }, 
    "messages": { 
     ".read": "auth != null && !root.child('bannedUsers').child(auth.uid).exists()" 
    } 
    } 
} 

Jeśli użyjesz innego back-end, implementacja będzie inna. Ale taka czarna lista jest powszechnym podejściem do banowania użytkowników. Przekonasz się, że możesz nawet zadbać o swoje uwierzytelnienie, że je tylko banujesz, zamiast usuwać ich poświadczenia (które mogli po prostu odtworzyć).

+0

Wielkie dzięki za pomoc mi w tej sprawie. Nie jestem pewien, jakie podejście powinienem podjąć. W tej samej notatce chciałbym się dowiedzieć, czy detektory AuthStateChange są uruchamiane, jeśli token dostępu wygasł? I w jakim czasie wygasają tokeny? –

+0

Krótkotrwałe tokeny dostępu wygasają w ciągu godziny (stąd moja uwaga, że ​​zajmie to najwyżej godzinę). Jeśli tokena nie można odświeżyć, to z pewnością wywoła zmianę stanu uwierzytelnienia. Jeśli odświeżenie tokena może również wywołać metodę, ale nie sprawdziłem od razu (ta jest bardziej dyskusyjna). –

+0

Dzięki, Frank. Ale zauważyłem, że zalogowałem się z moim kontem Google do aplikacji i nadal się loguję po 2 dniach. To właśnie chciałem wiedzieć. Po zalogowaniu się, kiedy te żetony tracą ważność, a użytkownik musi ponownie się zalogować, aby otrzymać nowe tokeny? –

Powiązane problemy