JavascriptProva

giovedì 1 settembre 2016

Sfondamento del problema dell'autenticazione.

Ecco, creo un oggetto FirebaseAuth, che forse significa "Autore", o "Autenticazione", non so...
Intanto lo creo.
        FirebaseAuth mAuth;
        mAuth=FirebaseAuth.getInstance();
Ora provo a creare un profilo.
Applico CreateUserWithEmailAndPassword:
        mAuth.createUserWithEmailAndPassword("mzungu@alice.it","bigonga")
                .addOnCompleteListener(this,new OnCompleteListener(){

                    @Override
                    public void onComplete(@NonNull Task task) {

                    }
                });


Riprovo da zero.

Vediamo se si può avere un elenco degli account creati.
La chiave di tutto è il metodo che crea l'account.
Troviamolo.

    private void createAccount(String email, String password) {
        Log.d(TAG, "createAccount:" + email);
        if (!validateForm()) {
            return;
        }

        showProgressDialog();

        // [START create_user_with_email]
        mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        Log.d(TAG, "createUserWithEmail:onComplete:" + task.isSuccessful());

                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.
                        if (!task.isSuccessful()) {
                            Toast.makeText(EmailPasswordActivity.this, R.string.auth_failed,
                                    Toast.LENGTH_SHORT).show();
                        }

                        // [START_EXCLUDE]
                        hideProgressDialog();
                        // [END_EXCLUDE]
                    }
                });
        // [END create_user_with_email]
    }
Questo metodo, createAccount, si avvale del metodo createUserWithEmailAndPassword.
Eccolo nel dettaglio:
        mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        Log.d(TAG, "createUserWithEmail:onComplete:" + task.isSuccessful());

                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.
                        if (!task.isSuccessful()) {
                            Toast.makeText(EmailPasswordActivity.this, R.string.auth_failed,
                                    Toast.LENGTH_SHORT).show();
                        }

                        // [START_EXCLUDE]
                        hideProgressDialog();
                        // [END_EXCLUDE]
                    }
                });
Praticamente questa funzione aggiunge al metodo createUserWithEmailAndPassword(email, password) un listener, che dovrebbe essere quello che recepisce il completamento dell'operazione.
Nel frattempo, dovrebbe già essere eseguita la funzione di creazione di un utente.

E se io lo uso senza alcun listener aggiunto?

Intanto devo creare un mAuth.
FirebaseAuth mAuth;

.....

mAuth=FirebaseAuth.getInstance();
Ora posso applicare il metodo:
mAuth.createUserWithEmailAndPassword("mzungu@alice.it","password");
E vediamo che succede, se mi dà errore o che...

Non ho avuto alcun messaggio di errore, salvo un rallentamento del programma, ossia la comparsa della clessidretta per un po'.
Probabilmente il meccanismo è un po' lento, ed è per questo che nel codice viene evocata, a quanto ho capito, la comparsa di una progressDialog che viene poi tolta all'evento onComplete.
Per indagare questo, aggiungo il listener OnCompleteListener e pongo di scrivere qualcosa in LogCat una volta che scatti l'evento...
        mAuth.createUserWithEmailAndPassword("mzungu@alice.it","password")
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        System.out.println("FATTO!!!!");
                    }
                });
E vediamo cosa ne viene fuori...

Sì, il segnale appare con un po' di ritardo, quindi è possibile che l'utente venga effettivamente creato e che ci voglia un po' di tempo.

Ora facciamo l'ipotesi che l'utente sia stato creato, e proviamo a fare il sign in
Commentizzo tutto il già fatto e vediamo: anche qui abbiamo un metodo signIn che si avvale di una funzione signInWithEmailAndPassword.
Commentizzo e scrivo questa funzione.
        mAuth.signInWithEmailAndPassword("mzungu@alice.it","password")
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        System.out.println(task.isSuccessful());
                    }
                });
Ecco, dovrebbe scrivermi il risultato dell'operazione.
Vediamo...

Il risultato è false, anche quando inserisco e-mail e password uguali a quelle usate nell'ipotesi di creazione di un account.
Cosa c'è che non va?


Ecco, forse il mio errore sta nel fatto che cerco di operare sia la creazione sia l'autenticazione dell'utente nel corso del metodo onCreate!
Nel codice di esempio, le cose non stanno affatto così, perché le due operazioni vengono innescate dalla pressione di due pulsanti, a metodo onCreate già abbondantemente eseguito. Sono soltanto i codici, quelli dichiarati in onCreate.

r Dunque facciamo la stessa cosa: mi predispongo due pulsanti.

Ottengo ancora false.

Non so se la creazione dell'utente sia andata a buon fine perché mi appare solo "CREAZIONE ESEGUITA", ma non è subordinato alla riuscita o meno dell'operazione.


Forse c'entra qualcosa quel fantomatico listener che non ho ancora capito a che serva, che viene settato all'evento onStart...

Vediamolo un po'...

Dovrebbe segnalare il cambiamento di stato dell'autenticazione, ossia il momento in cui si fa il Sign in di un utente...

C'è poi un UpdateUI(user) che usa come parametro un oggetto FirebaseUser creato nel contesto dell'evento stesso... potrebbe essere importante!

Provo a implementarlo in onCreate e a settarlo in onStart.
FirebaseAuth.AuthStateListener authStateListener;

........

        authStateListener=new FirebaseAuth.AuthStateListener(){

            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user=firebaseAuth.getCurrentUser();
                if(user!=null)System.out.println("USER NON NULLO");
                else System.out.println("USER NULLO");
            }
        };
e lo setto in onStart:
    @Override
    protected void onStart(){
        super.onStart();
        mAuth.addAuthStateListener(authStateListener);
    }
Ho trascurato quell'UpdateUI e ho dato dei comandi personalizzati da scrivere in LogCat.
Vediamo...

Niente!
E anche updateUI non è altro che un aggiustamento del form...



Sono molto sfiduciato: non so dove andare a cercare...




Ed ecco che mi capita questa pagina che spiega tutto: alla sezione Add Firebase Authentication to your app trovo le istruzioni risolutive!
Ora posso sbizzarrirmi.

Nessun commento:

Posta un commento