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
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();
}
});
}
fonte
2016-12-17 18:52:38
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? –
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. –
Grazie. Non avendo una reimpostazione della password sarà problematico :( –