
Guida completa a Firebase Authentication in Android con Java
In questa guida vedremo come integrare Firebase Authentication in un’app Android scritta in Java. Nello specifico, copriremo la configurazione iniziale del progetto, l’autenticazione con email e password, il login con Google, la gestione dell’utente corrente, il logout e includeremo inoltre esempi di codice Java completi, così da avere una panoramica completa su come utilizzare Firebase Authentication Android Java in un progetto reale.
Prerequisiti per Firebase Authentication Android
Innanzitutto, prima di iniziare, assicurati di avere:
- Android Studio installato (versione recente)
- Un dispositivo Android o un emulatore configurato
- Un account Google e accesso alla console Firebase
- Conoscenze base di Java e Android (Activity, Intent, layout XML)
1. Setup di Firebase Authentication nel progetto Android
1.1 Creare un progetto Firebase dalla console
1. In primo luogo, vai su console.firebase.google.com e clicca su “Aggiungi progetto”.
2. Successivamente, inserisci il nome del progetto (es. FirebaseAuthDemo) e completa la procedura guidata lasciando le impostazioni predefinite se non hai esigenze particolari.
3. Una volta creato il progetto, nella dashboard di Firebase clicca pertanto sull’icona di Android per aggiungere un’app Android.
4. Quindi, inserisci il nome del package esattamente come definito nel tuo progetto Android (es. com.example.firebaseauthdemo), un nickname opzionale e, se disponibile, il certificato SHA-1 (utile in particolare per Google Sign-In).
5. In seguito, scarica il file google-services.json e copialo nella cartella app/ del tuo progetto Android (livello modulo).
1.2 Configurare Gradle
Apri il file build.gradle (Project) e aggiungi il plugin Google Services se non è già presente.
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.0.2'
classpath 'com.google.gms:google-services:4.4.2'
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
Nel file build.gradle (Module: app) devi inoltre aggiungere le dipendenze per Firebase Authentication e, se ti servirà, per Google Sign-In.
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
android {
namespace "com.example.firebaseauthdemo"
compileSdk 34
defaultConfig {
applicationId "com.example.firebaseauthdemo"
minSdk 21
targetSdk 34
versionCode 1
versionName "1.0"
}
}
dependencies {
implementation 'com.google.firebase:firebase-auth:23.0.0'
implementation 'com.google.android.gms:play-services-auth:21.2.0'
}
Infine, sincronizza il progetto con Gradle (clic su “Sync Now” in alto a destra).
2. Abilitare i metodi di autenticazione Firebase
2.1 Abilitare Email/Password in Firebase Auth
1. Innanzitutto, nella console Firebase, vai su Authentication > Metodo di accesso.
2. Successivamente, clicca su Email/Password e abilita l’opzione “Abilita”.
3. Quindi, salva le modifiche.
2.2 Abilitare Google Sign-In con Firebase Auth
1. Sempre in Authentication > Metodo di accesso, seleziona pertanto Google.
2. In seguito, abilita il provider, assicurandoti che l’email di supporto sia corretta.
3. Infine, salva le modifiche.
3. Inizializzare Firebase Authentication in Android
3.1 Inizializzazione di Firebase Auth nel codice Java
Firebase viene inizializzato automaticamente se hai aggiunto correttamente google-services.json e il plugin com.google.gms.google-services. Tuttavia, puoi inoltre inizializzarlo manualmente nella tua Application o nella prima Activity:
import android.app.Application;
import com.google.firebase.FirebaseApp;
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
FirebaseApp.initializeApp(this);
}
}
Ricorda altresì di dichiarare la classe MyApp nel file AndroidManifest.xml:
<application
android:name=".MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.FirebaseAuthDemo">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
4. Autenticazione Email/Password con Firebase Authentication
4.1 Layout di esempio per Registrazione e Login
Crea un layout semplice per gestire registrazione e login nella stessa schermata (per semplificità). In particolare, il file da modificare è: activity_main.xml.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="16dp">
<EditText
android:id="@+id/editTextEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email"
android:inputType="textEmailAddress" />
<EditText
android:id="@+id/editTextPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Password"
android:inputType="textPassword" />
<Button
android:id="@+id/buttonRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Registrati" />
<Button
android:id="@+id/buttonLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Login" />
<Button
android:id="@+id/buttonLogout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Logout" />
</LinearLayout>
4.2 Registrare un nuovo utente (createUserWithEmailAndPassword)
Di seguito è presentato un esempio completo di MainActivity.java che gestisce la registrazione e il login con email e password.
package com.example.firebaseauthdemo;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
public class MainActivity extends AppCompatActivity {
private EditText editTextEmail, editTextPassword;
private Button buttonRegister, buttonLogin, buttonLogout;
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAuth = FirebaseAuth.getInstance();
editTextEmail = findViewById(R.id.editTextEmail);
editTextPassword = findViewById(R.id.editTextPassword);
buttonRegister = findViewById(R.id.buttonRegister);
buttonLogin = findViewById(R.id.buttonLogin);
buttonLogout = findViewById(R.id.buttonLogout);
buttonRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
registerUser();
}
});
buttonLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginUser();
}
});
buttonLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
logoutUser();
}
});
}
private void registerUser() {
String email = editTextEmail.getText().toString().trim();
String password = editTextPassword.getText().toString().trim();
if (TextUtils.isEmpty(email)) {
editTextEmail.setError("Inserisci l'email");
return;
}
if (TextUtils.isEmpty(password)) {
editTextPassword.setError("Inserisci la password");
return;
}
if (password.length() < 6) {
editTextPassword.setError("La password deve avere almeno 6 caratteri");
return;
}
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user = mAuth.getCurrentUser();
Toast.makeText(MainActivity.this,
"Registrazione riuscita: " + user.getEmail(),
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this,
"Registrazione fallita: " + task.getException().getMessage(),
Toast.LENGTH_LONG).show();
}
}
});
}
private void loginUser() {
String email = editTextEmail.getText().toString().trim();
String password = editTextPassword.getText().toString().trim();
if (TextUtils.isEmpty(email)) {
editTextEmail.setError("Inserisci l'email");
return;
}
if (TextUtils.isEmpty(password)) {
editTextPassword.setError("Inserisci la password");
return;
}
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user = mAuth.getCurrentUser();
Toast.makeText(MainActivity.this,
"Login riuscito: " + user.getEmail(),
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this,
"Login fallito: " + task.getException().getMessage(),
Toast.LENGTH_LONG).show();
}
}
});
}
private void logoutUser() {
mAuth.signOut();
Toast.makeText(MainActivity.this, "Logout eseguito", Toast.LENGTH_SHORT).show();
}
@Override
protected void onStart() {
super.onStart();
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser != null) {
Toast.makeText(this,
"Utente loggato: " + currentUser.getEmail(),
Toast.LENGTH_SHORT).show();
}
}
}
4.3 Gestire errori comuni
Alcuni errori comuni che potresti voler gestire in modo specifico (ad esempio per mostrare messaggi più chiari):
FirebaseAuthInvalidCredentialsException: credenziali non valide (es. email non valida)FirebaseAuthUserCollisionException: l’email è già registrataFirebaseAuthInvalidUserException: l’utente non esiste o è stato disabilitato
In questo modo, puoi fare un instanceof sull’eccezione ottenuta da task.getException() per gestirli in modo mirato.
5. Login con Google Sign-In tramite Firebase Authentication
5.1 Configurare Google Sign-In nel progetto
Innanzitutto, assicurati di aver:
- Aggiunto la dipendenza
com.google.android.gms:play-services-auth - Configurato SHA-1 nella console Firebase (per app reali)
- Abilitato Google come provider di accesso in Firebase
Successivamente, aggiungi il pulsante di login con Google al layout (es. in activity_main.xml):
<com.google.android.gms.common.SignInButton
android:id="@+id/buttonGoogleSignIn"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
5.2 Codice Java completo per Google Sign-In
Di seguito è riportato un esempio di GoogleSignInActivity.java che gestisce il flusso di login con Google e il collegamento a Firebase.
package com.example.firebaseauthdemo;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.common.SignInButton;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;
public class GoogleSignInActivity extends AppCompatActivity {
private static final String TAG = "GoogleSignInActivity";
private GoogleSignInClient mGoogleSignInClient;
private FirebaseAuth mAuth;
private SignInButton buttonGoogleSignIn;
private final ActivityResultLauncher<Intent> signInLauncher =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == RESULT_OK) {
Intent data = result.getData();
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
} else {
Toast.makeText(this, "Login con Google annullato", Toast.LENGTH_SHORT).show();
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_google_sign_in);
mAuth = FirebaseAuth.getInstance();
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
buttonGoogleSignIn = findViewById(R.id.buttonGoogleSignIn);
buttonGoogleSignIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
signIn();
}
});
}
private void signIn() {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
signInLauncher.launch(signInIntent);
}
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
GoogleSignInAccount account = completedTask.getResult(ApiException.class);
firebaseAuthWithGoogle(account.getIdToken());
} catch (ApiException e) {
Log.w(TAG, "Google sign in failed", e);
Toast.makeText(this, "Google sign in failed: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
private void firebaseAuthWithGoogle(String idToken) {
AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user = mAuth.getCurrentUser();
Toast.makeText(GoogleSignInActivity.this,
"Login con Google riuscito: " + user.getEmail(),
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(GoogleSignInActivity.this,
"Autenticazione con Firebase fallita: " + task.getException().getMessage(),
Toast.LENGTH_LONG).show();
}
}
});
}
@Override
protected void onStart() {
super.onStart();
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser != null) {
Toast.makeText(this,
"Già loggato come: " + currentUser.getEmail(),
Toast.LENGTH_SHORT).show();
}
}
}
Nota: il valore @string/default_web_client_id viene generato automaticamente nel file strings.xml quando configuri Firebase e quindi scarichi google-services.json.
6. Gestione dell’utente con Firebase Authentication
6.1 Ottenere l’utente loggato
Per ottenere l’utente correntemente autenticato, devi utilizzare getCurrentUser() su FirebaseAuth:
FirebaseAuth mAuth = FirebaseAuth.getInstance();
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser != null) {
String uid = currentUser.getUid();
String email = currentUser.getEmail();
String displayName = currentUser.getDisplayName();
} else {
// Nessun utente loggato
}
6.2 Aggiornare il profilo utente
In particolare, puoi aggiornare nome visualizzato e foto profilo dell’utente autenticato:
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
.setDisplayName("Mario Rossi")
// .setPhotoUri(Uri.parse("https://example.com/mario.jpg"))
.build();
user.updateProfile(profileUpdates)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
// Profilo aggiornato
}
}
});
}
6.3 Verifica email, reset password e cancellazione account
Di seguito sono riportati esempi rapidi di operazioni comuni:
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
// Invia email di verifica
if (user != null) {
user.sendEmailVerification();
}
// Invia email per reset password
FirebaseAuth.getInstance().sendPasswordResetEmail("utente@example.com");
// Cancellare l'account corrente
if (user != null) {
user.delete().addOnCompleteListener(task -> {
if (task.isSuccessful()) {
// Account eliminato
}
});
}
7. Logout con Firebase Authentication
Per effettuare il logout dall’app (invalidando l’utente corrente a livello locale) è sufficiente chiamare signOut() su FirebaseAuth:
FirebaseAuth mAuth = FirebaseAuth.getInstance();
mAuth.signOut();
Inoltre, se stai usando Google Sign-In, puoi anche disconnettere l’utente dal client Google (opzionale ma comunque consigliato):
mGoogleSignInClient.signOut()
.addOnCompleteListener(this, task -> {
// Utente disconnesso anche da Google
});
8. Best practice per Firebase Authentication su Android
8.1 Sicurezza
Firebase Authentication gestisce in modo sicuro le credenziali, ma tuttavia devi comunque:
- Validare e sanificare tutti i dati inseriti dall’utente
- Usare sempre HTTPS (Android lo fa di default per i domini Firebase)
- Configurare correttamente le regole di sicurezza di Firestore/Realtime Database se salvi dati utenti
8.2 UX con Firebase Auth: esperienza utente
Per ottenere un’esperienza utente migliore, considera inoltre quanto segue:
- Mostra indicatori di caricamento (ProgressBar) durante le chiamate di autenticazione
- Fornisci messaggi di errore chiari (es. “Email non valida”, “Password troppo corta”)
- Ricorda l’utente tra le sessioni sfruttando
getCurrentUser()inonStart()
9. Conclusione: Firebase Authentication Android Java
In conclusione, in questa guida abbiamo visto come configurare Firebase nel tuo progetto Android, abilitare e utilizzare l’autenticazione con email/password e Google Sign-In, gestire l’utente corrente e implementare il logout utilizzando Firebase Authentication Android Java. Da qui in avanti puoi estendere l’app aggiungendo altri provider (Facebook, Twitter, Apple), collegare più metodi di accesso allo stesso account e integrare inoltre database e storage per creare un backend completo.
Rispondi