2016-05-26 11 views
5

Mi piacerebbe utilizzare Firebase per la mia app Web destinata alle persone affette da demenza in una casa di cura. Non dispongono di account di posta elettronica o social network, quindi è necessario un semplice nome utente/password registrati/registrati.Come fornire login utente con un nome utente e NON un'email?

Qual è il modo più semplice per farlo? Da quello che vedo nei documenti dovrei usare un flusso di autenticazione personalizzato ma non ho un server di autenticazione esistente.

Se è necessario farlo, qual è il modo più semplice per fornire il token? In Azure ci sono funzioni e AWS ha Lambda ma non vedo nulla qui è Firebase

risposta

3

Si è verificato che l'accesso tramite nome utente/password non è supportato in modo nativo in Firebase Auth in questo momento.

Una soluzione si potrebbe prendere senza bisogno di usare autenticazione personalizzato con un altro back-end è quello di accettare nomi utente nella vostra interfaccia utente, ma sulla logica di fondo, aggiungere "@yourowndomain.com" prima di chiamare le funzioni per iscriversi o accedi con la posta elettronica.

Così si sarebbe utilizzando e-mail/password di autenticazione, la mappatura <username> a <username>@yourowndomain.com

+0

Idea interessante - Non pensavo a quel semplice 'trucco' La mia preoccupazione sarebbe un tentativo inaspettato da parte di Firebase di usare l'indirizzo email. Dovrei gestirlo in una regola di cattura. Inoltre, il flusso di reimpostazione della password richiede che qualcuno risponda a una e-mail a tale indirizzo? –

+0

Ciao Steve. In effetti, alcune situazioni possono innescare l'invio di una e-mail a tali indirizzi, ma devi sempre attivarli da solo. I casi in cui vengono inviate le e-mail sono: verifiche dell'indirizzo e-mail, reset della password e modifiche agli indirizzi e-mail. Se non offri nessuna di queste funzionalità nella tua app, nessuna email verrà inviata. Tuttavia, assicurarsi di utilizzare un nome di dominio che non abbia indirizzi email reali lì, per evitare conflitti. –

+3

Grazie. Non avendo una reimpostazione della password sarà problematico :( –

6

Aggiunta di un dominio fittizio alla fine è una sorta di una patch e dovrebbe essere evitato. Per abilitare l'accesso al nome utente basta seguire questi semplici passaggi.

Iscriversi

durante l'iscrizione prendere l'userid, e-mail e la password. Registra l'utente con e-mail e password normali. Al successo, salva l'email contro user_id in un nodo separato (ramo).

mButtonSignUp.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(isValid()){ 
       mProgressBar.setVisibility(View.VISIBLE); 
       final String userId = mEditTextUserId.getText().toString(); 
       final String emailId = mEditTextEmail.getText().toString() ; 
       String password = mEditTextPassword.getText().toString() ; 
       firebaseRef.createUser(emailId, password, new Firebase.ResultHandler() { 
        @Override 
        public void onSuccess() { 
         firebaseRef.child("user_ids").child(userId).setValue(emailId); 
         Toast.makeText(getBaseContext(),"You are successfully registered ",Toast.LENGTH_SHORT).show(); 
         mProgressBar.setVisibility(View.GONE); 
        } 

        @Override 
        public void onError(FirebaseError firebaseError) { 
         mProgressBar.setVisibility(View.GONE); 
         Toast.makeText(getBaseContext(),firebaseError.toString(),Toast.LENGTH_SHORT).show(); 
        } 
       }); 

      } 
     } 
    }); 

Database

struttura del database sarà simile a questa

enter image description here

Accesso

Verificare se l'utente ha inserito una e-mail o ID utente. Se si tratta di un ID e-mail, eseguire direttamente il login con esso altrimenti recuperare l'ID e-mail associato con il nome utente ed eseguire il login.

Button buttonLogIn = (Button)findViewById(R.id.button_login); 
    buttonLogIn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) {    

      mProgressBar.setVisibility(View.VISIBLE); 
      String username = mEditTextEmail.getText().toString() ; 
      final String password = mEditTextPassWord.getText().toString() ; 

      // Check if it is an email or not 
      if(android.util.Patterns.EMAIL_ADDRESS.matcher(username).matches())     { 
       performLogin(username,password); 
      }else{ 
       //get the emailId associated with the username  
     firebaseRef.child("user_ids").child(username) 
       .addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         if(dataSnapshot!=null){ 
          String userId = dataSnapshot.getValue(String.class); 
          performLogin(userId,password); 
         } 
        } 

        @Override 
        public void onCancelled(FirebaseError firebaseError) { 

        } 
       }); 
      } 

     } 
    }); 

private void performLogin(String emailId, String password) { 
    firebaseRef.authWithPassword(emailId,password, new Firebase.AuthResultHandler() { 
     @Override 
     public void onAuthenticated(AuthData authData) { 
      uid = authData.getUid() ; 
      Toast.makeText(getBaseContext(), authData.toString(), Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onAuthenticationError(FirebaseError firebaseError) { 
      Toast.makeText(getBaseContext(), firebaseError.toString(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 
+0

Se capisco l'unica differenza, proponi di archiviare un'e-mail randomizzata per coloro che non ne hanno uno e controllare sul server al momento dell'accesso? Immagino che sia un po 'più sicuro. Questo è ancora un problema però :) –

+2

Se la proposta è di memorizzare l'indirizzo email reale dell'utente, questo sembra problematico in quanto l'indirizzo potrebbe essere esposto a qualsiasi client. – okhobb

+0

Sì, è una buona idea ma sicura solo sul server – tommybananas

1

Si può usare la soluzione di Alfonso pure. E dove hai bisogno di una vera e-mail, puoi impostare un campo di testo per una e-mail quando l'utente si registra e puoi tenerlo nel tuo database e puoi usarlo.