Laravel – Firebase – Firestore

Ecco come ho collegato un progetto Firebase ad una nuova installazione di Laravel.

La mia necessità è quella di utilizzare l’autenticazione tramite email e password e il database Firestore.

Come sempre io utilizzo la linea di comando e installo i progetti di sviluppo su un mio server Debian 12 quindi una macchina Linux tranquilla. In questo modo sono libero di installare tutto ciò di cui ho bisogno e anche di più…

Per gestire gli spazi hosting uso ISPConfig3 e come server web uso Apache. Una volta installato Laravel (paragrafo successivo) ricordiamoci di configurare la DocumetnRoot sulla cartella “public”.

Laravel

Per prima cosa installiamo Laravel che al momento in cui scrivo è alla versione 12:

# composer create-project –prefer-dist laravel/laravel laravel-project

Una volta finito di lavorare, sposto tutto il contenuto della cartella “laravel-project” sull root del sito:

# mv laravel-project/ .

Spostati anche i file nascosti individuabili con:

# ls -la laravel-project/

possiamo eliminare la cartella laravel-project con rmdir laravel-project.

Adesso possiamo proseguire installando un componente che assolve a tutte le operazioni necessarie a connettersi correttamente al progetto Firebase:

# composer require kreait/laravel-firebase

Firebase

Immagino che tu abbia già un account firebase, forse hai anche già un progetto. Se così non fosse creane uno e vai in “Authentication” poi “Metodi di accesso” e seleziona “Email/password”. Adesso attivalo e… fatto, hai abilitato il primo metodo di accesso.

Adesso clicca su “Panoramica del progetto” e poi su “Impostazioni del progetto”. In questa fase ci interessa solo un file JSON con le varie chiavi e i parametri da passare a Laravel, quindi andiamo su “Account di servizio” e “Genera nuova chiave privata”.

Scaricato il file va slavato nella cartella “storage/app/firebase” di Laravel.

Configurazione generale

Adesso mettiamo insieme le varie cose.

Apriamo il file .env di Laravel e aggiungiamo in fondo:

FIREBASE_CREDENTIALS=storage/app/firebase/progetto-firebase-adminsdk-xxx.json (il tuo file)
FIREBASE_PROJECT=id del tuo progetto

Salviamo e rigeneriamo i parametri con

# php artisan optimize:clear

Adesso dobbiamo far pubblicare il file di configurazione del plugin eseguendo:

# php artisan vendor:publish –provider=”Kreait\Laravel\Firebase\ServiceProvider”

Si aggiungerà il file config/firebase.php e aprendolo facciamo queste modifiche:

'default' => 'id progetto firebase',
'projects' => [
'id progetto firebase' => [
'credentials' => [
'file' => env('FIREBASE_CREDENTIALS', base_path('il nome del file delle credenziali scaricato')),
],
....
],

Authentication con email e password

Creo un controller in app/Http/Controller di nome AuthController.php:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Kreait\Firebase\Contract\Auth;

class AuthController extends Controller
{
protected $auth;</code>

public function __construct(Auth $auth)
{
$this->auth = $auth;
}

/**
* Login con email e password Firebase
*/
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required'
]);

try {
$signInResult = $this->auth->signInWithEmailAndPassword(
$request->email,
$request->password
);

$firebaseUser = $signInResult->data();
$idToken = $signInResult->idToken();

return response()->json([
'message' => 'Login effettuato con successo!',
'user' => $firebaseUser,
'token' => $idToken,
]);
} catch (\Kreait\Firebase\Exception\Auth\InvalidPassword $e) {
return response()->json(['error' => 'Password non valida'], 401);
} catch (\Kreait\Firebase\Exception\Auth\UserNotFound $e) {
return response()->json(['error' => 'Utente non trovato'], 404);
} catch (\Throwable $e) {
return response()->json(['error' => $e->getMessage()], 500);
}
}

public function register(Request $request)
{
$userProperties = [
'email' => $request->email,
'password' => $request->password,
];

$this->auth->createUser($userProperties);
return response()->json(['message' => 'User created successfully']);
}
}

Firestore

Per utilizzare Firestore dobbiamo installare la dipendenza in Laravel e alcune librerie di Google:

# composer require google/cloud-firestore

Poi:

# pecl install grpc

Questo compilerà le librerie di comunicazione con i server Google e richiedono parecchio tempo per essere compilati (macchina Linux Debian 12 e nel mio caso più di 2 ore, il server ha bogomips 4190…:-).