2016-07-13 44 views
5

sotto il cappuccioFirebase autenticazione Stato Cambiamento non si attiva quando l'utente è disattivato o cancellato

Sto usando Firebase autenticazione nella mia app Android per iscriversi/gli utenti che utilizzano Google, Facebook e-mail/password . Finora, quasi tutto funziona bene tranne che per un singolo scenario.

Lo scenario

ho bisogno di disabilitare o eliminare account utente dalla console Firebase volte a vietare alcuni utenti di mia app.

In tal caso, quando si disabilita o si elimina quel particolare utente, l'utente deve ottenere disconnesso immediatamente dall'app e non dovrebbe essere più in grado di utilizzarlo.

The Bug

ho usato il AuthStateListener per ascoltare le modifiche dello stato di autenticazione e di scollegare l'utente automaticamente non appena il loro account è disabilitato o eliminato.

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

Ma non ho mai visto AuthStateListener generare alcun evento per queste azioni. Quindi non sono in grado di disconnettere immediatamente l'utente e l'utente può continuare a utilizzare l'app.

Sarei grato se qualcuno possa aiutare a risolvere questo problema.

risposta

11

La disabilitazione o l'eliminazione di un account utente non attiva una modifica dello stato dell'autorizzazione. Né dovrebbe, l'utente è ancora autenticato. Al massimo un'ora, Firebase Authentication tenterà di aggiornare il token di accesso per l'utente. L'aggiornamento fallirà, a quel punto l'utente diventerà non autenticato e l'evento di modifica dello stato dell'autent sarà attivato.

Se si desidera revocare immediatamente l'autorizzazione dell'utente, sarà necessario farlo in un'altra parte della logica dell'applicazione. Un modo comune per farlo consiste nell'avere una lista nera nella tua applicazione, ad es. nel Firebase Database:

/bannedUsers 
    uidOfBannedUser: true 

Ora, quando si elimina/disabilitare l'account di un utente nel pannello Autenticazione, è anche aggiungere il loro uid alla lista degli utenti esclusi nel database.

Il database può quindi essere protetto dall'accesso da utenti non autorizzati aggiungendo una clausola al numero database security rules, ad es.

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

Se si utilizza un back-end diverso, l'implementazione sarà diversa. Ma una lista nera come questa è un approccio comune per vietare gli utenti. Scoprirai che potresti persino interessarti alla loro autenticazione che li hai solo vietati, invece di eliminare le loro credenziali (che potrebbero semplicemente ricreare).

+0

Grazie mille per avermi aiutato in questo. Non sono chiaro su quale approccio dovrei prendere. Nella stessa nota, vorrei sapere se i listener AuthStateChange vengono attivati ​​se il token di accesso è scaduto? E in quanto tempo scadono i token? –

+0

I token di accesso di breve durata scadono in un'ora (da qui la mia osservazione che ci vorrà al massimo un'ora). Se non è possibile aggiornare il token, questo attiverà sicuramente una modifica dello stato dell'autorizzazione. Se il token si aggiorna, può anche chiamare il metodo, ma non l'ho controllato da un po '(che è più discutibile). –

+0

Grazie Frank. Ma ho osservato che, ho effettuato l'accesso con il mio account Google all'app ed è ancora connesso dopo 2 giorni. Questo è quello che volevo sapere. Una volta effettuato l'accesso, quando scadono questi token e l'utente deve effettuare nuovamente l'accesso per ottenere nuovi token? –

Problemi correlati