Firebase Angular Web Frameworks Codelab

1. Was Sie erstellen

In diesem Codelab erstellen Sie einen Reiseblog mit einer Karte, die in Echtzeit von mehreren Nutzern bearbeitet werden kann. Dazu verwenden Sie die neueste Version unserer Angular-Bibliothek: AngularFire. Die endgültige Web-App besteht aus einem Reiseblog, in dem Sie Bilder zu jedem Ort hochladen können, den Sie besucht haben.

AngularFire wird zum Erstellen der Web-App verwendet, die Emulator Suite für lokale Tests, Authentication zum Erfassen von Nutzerdaten, Firestore und Storage zum Speichern von Daten und Medien, unterstützt von Cloud Functions, und schließlich Firebase Hosting zum Bereitstellen der App.

Lerninhalte

  • Lokale Entwicklung mit Firebase-Produkten mit der Emulator Suite
  • Web-App mit AngularFire optimieren
  • Daten in Firestore dauerhaft speichern
  • Medien in Storage beibehalten
  • App in Firebase Hosting bereitstellen
  • Cloud Functions für die Interaktion mit Datenbanken und APIs verwenden

Voraussetzungen

  • Node.js-Version 10 oder höher
  • Ein Google-Konto zum Erstellen und Verwalten Ihres Firebase-Projekts
  • Firebase CLI-Version 11.14.2 oder höher
  • Ein Browser Ihrer Wahl, z. B. Chrome
  • Grundlegende Kenntnisse von Angular und JavaScript

2. Beispielcode abrufen

Klonen Sie das GitHub-Repository des Codelabs über die Befehlszeile:

git clone https://github.com/firebase/codelab-friendlychat-web

Wenn Sie Git nicht installiert haben, können Sie das Repository auch als ZIP-Datei herunterladen.

Das GitHub-Repository enthält Beispielprojekte für mehrere Plattformen.

In diesem Codelab wird nur das Webframework-Repository verwendet:

  • 📁 webframework: Der Startcode, auf dem Sie in diesem Codelab aufbauen.

Abhängigkeiten installieren

Installieren Sie nach dem Klonen die Abhängigkeiten im Stammordner und im Ordner functions, bevor Sie die Webanwendung erstellen.

cd webframework && npm install
cd functions && npm install

Firebase CLI installieren

Installieren Sie die Firebase CLI mit diesem Befehl in einem Terminal:

npm install -g firebase-tools

Prüfen Sie mit folgendem Befehl, ob Ihre Firebase CLI-Version höher als 11.14.2 ist:

firebase  --version

Wenn Ihre Version niedriger als 11.14.2 ist, führen Sie bitte ein Update mit folgendem Befehl durch:

npm update firebase-tools

3. Firebase-Projekt erstellen und einrichten

Firebase-Projekt erstellen

  1. Melden Sie sich mit Ihrem Google-Konto in der Firebase Console an.
  2. Klicken Sie auf die Schaltfläche, um ein neues Projekt zu erstellen, und geben Sie dann einen Projektnamen ein (z. B. FriendlyChat).
  3. Klicken Sie auf Weiter.
  4. Lesen und akzeptieren Sie bei Aufforderung die Firebase-Nutzungsbedingungen und klicken Sie dann auf Weiter.
  5. (Optional) Aktivieren Sie die KI-Unterstützung in der Firebase Console (als „Gemini in Firebase“ bezeichnet).
  6. Für dieses Codelab benötigen Sie kein Google Analytics. Deaktivieren Sie daher die Google Analytics-Option.
  7. Klicken Sie auf Projekt erstellen, warten Sie, bis Ihr Projekt bereitgestellt wurde, und klicken Sie dann auf Weiter.

Dem Projekt eine Firebase-Web-App hinzufügen

  1. Klicken Sie auf das Web-Symbol, um eine neue Firebase-Web-App zu erstellen.
  2. Im nächsten Schritt wird ein Konfigurationsobjekt angezeigt. Kopieren Sie den Inhalt dieses Objekts in die Datei environments/environment.ts.

Firebase-Produkte einrichten

Die Anwendung, die wir erstellen, verwendet Firebase-Produkte, die für Web-Apps verfügbar sind:

  • Firebase Authentication ermöglicht es Ihren Nutzern, sich mühelos in der App anzumelden.
  • Cloud Firestore speichert strukturierte Daten in der Cloud und benachrichtigt Sie sofort, wenn sich Daten ändern.
  • Cloud Storage for Firebase speichert Dateien in der Cloud.
  • Firebase Hosting hostet und stellt Assets bereit.
  • Funktionen für die Interaktion mit internen und externen APIs.

Für einige dieser Produkte sind spezielle Konfigurationen erforderlich oder sie müssen über die Firebase Console aktiviert werden.

Google-Anmeldung für Firebase Authentication aktivieren

Damit Nutzer sich mit ihren Google-Konten in der Web-App anmelden können, verwenden wir die Anmeldemethode Google.

So aktivieren Sie die Google-Anmeldung:

  1. Suchen Sie in der Firebase Console im linken Bereich nach dem Abschnitt Build.
  2. Klicken Sie auf Authentifizierung und dann auf den Tab Anmeldemethode (oder klicken Sie hier, um direkt dorthin zu gelangen).
  3. Aktivieren Sie den Anmeldeanbieter Google und klicken Sie dann auf Speichern.
  4. Legen Sie den öffentlich sichtbaren Namen Ihrer App auf <your-project-name> fest und wählen Sie im Drop-down-Menü eine E-Mail-Adresse für den Projektsupport aus.

Cloud Firestore aktivieren

  1. Klicken Sie im Abschnitt Build in der Firebase Console auf Firestore-Datenbank.
  2. Klicken Sie im Cloud Firestore-Bereich auf Datenbank erstellen.
  3. Legen Sie den Speicherort für Cloud Firestore-Daten fest. Sie können die Standardeinstellung beibehalten oder eine Region in Ihrer Nähe auswählen.

Cloud Storage aktivieren

Die Web-App nutzt Cloud Storage for Firebase zum Speichern, Hochladen und Teilen von Bildern.

  1. Klicken Sie in der Firebase Console im Abschnitt Build auf Storage.
  2. Wenn keine Schaltfläche Jetzt starten vorhanden ist, bedeutet das, dass Cloud Storage bereits

aktiviert ist und Sie die folgenden Schritte nicht ausführen müssen.

  1. Klicken Sie auf Jetzt starten.
  2. Lesen Sie den Haftungsausschluss zu den Sicherheitsregeln für Ihr Firebase-Projekt und klicken Sie dann auf Weiter.
  3. Der Cloud Storage-Speicherort ist mit derselben Region vorausgewählt, die Sie für Ihre Cloud Firestore-Datenbank ausgewählt haben. Klicken Sie auf Fertig, um die Einrichtung abzuschließen.

Mit den Standardsicherheitsregeln kann jeder authentifizierte Nutzer Beliebiges in Cloud Storage schreiben. Wir werden unseren Speicher später in diesem Codelab sicherer machen.

4. Mit Ihrem Firebase-Projekt verbinden

Mit der Firebase-Befehlszeile (CLI) können Sie Ihre Web-App lokal mit Firebase Hosting bereitstellen und in Ihrem Firebase-Projekt bereitstellen.

Achten Sie darauf, dass über die Befehlszeile auf das lokale webframework-Verzeichnis Ihrer App zugegriffen wird.

Verbinden Sie den Web-App-Code mit Ihrem Firebase-Projekt. Melden Sie sich zuerst über die Befehlszeile in der Firebase CLI an:

firebase login

Führen Sie als Nächstes den folgenden Befehl aus, um einen Projektalias zu erstellen. Ersetzen Sie $YOUR_PROJECT_ID durch die ID Ihres Firebase-Projekts.

firebase  use  $YOUR_PROJECT_ID

AngularFire hinzufügen

Führen Sie den folgenden Befehl aus, um AngularFire der App hinzuzufügen:

ng add @angular/fire

Folgen Sie dann der Anleitung in der Befehlszeile und wählen Sie die Funktionen aus, die in Ihrem Firebase-Projekt vorhanden sind.

Firebase initialisieren

So initialisieren Sie das Firebase-Projekt:

firebase init

Wählen Sie dann anhand der Eingabeaufforderungen in der Befehlszeile die Funktionen und Emulatoren aus, die in Ihrem Firebase-Projekt verwendet wurden.

Emulatoren starten

Führen Sie im Verzeichnis webframework den folgenden Befehl aus, um die Emulatoren zu starten:

firebase  emulators:start

Schließlich sollte Folgendes angezeigt werden:

$  firebase  emulators:start

i  emulators:  Starting  emulators:  auth,  functions,  firestore,  hosting,  functions

i  firestore:  Firestore  Emulator  logging  to  firestore-debug.log

i  hosting:  Serving  hosting  files  from:  public

  hosting:  Local  server:  http://localhost:5000

i  ui:  Emulator  UI  logging  to  ui-debug.log

i  functions:  Watching  "/functions"  for  Cloud  Functions...

  functions[updateMap]:  firestore  function  initialized.

  

┌─────────────────────────────────────────────────────────────┐

    All  emulators  ready!  It  is  now  safe  to  connect  your  app.  

  i  View  Emulator  UI  at  http://localhost:4000  

└─────────────────────────────────────────────────────────────┘

  

┌────────────────┬────────────────┬─────────────────────────────────┐

  Emulator    Host:Port    View  in  Emulator  UI  

├────────────────┼────────────────┼─────────────────────────────────┤

  Authentication    localhost:9099    http://localhost:4000/auth  

├────────────────┼────────────────┼─────────────────────────────────┤

  Functions    localhost:5001    http://localhost:4000/functions  

├────────────────┼────────────────┼─────────────────────────────────┤

  Firestore    localhost:8080    http://localhost:4000/firestore  

├────────────────┼────────────────┼─────────────────────────────────┤

  Hosting    localhost:5000    n/a  

└────────────────┴────────────────┴─────────────────────────────────┘

Emulator  Hub  running  at  localhost:4400

Other  reserved  ports:  4500

  

Issues?  Report  them  at  https://github.com/firebase/firebase-tools/issues  and  attach  the  *-debug.log  files.

Sobald die Meldung ✔All emulators ready! angezeigt wird, können Sie die Emulatoren verwenden.

Es sollte die (noch) nicht funktionierende UI der Reise-App angezeigt werden:

Fangen wir also an!

5. Web-App mit den Emulatoren verbinden

Anhand der Tabelle in den Emulator-Logs können Sie sehen, dass der Cloud Firestore-Emulator Port 8080 und der Authentication-Emulator Port 9099 überwacht.

EmulatorUI öffnen

Rufen Sie in Ihrem Webbrowser http://127.0.0.1:4000/ auf. Die Emulator Suite-Benutzeroberfläche sollte angezeigt werden.

App für die Verwendung der Emulatoren weiterleiten

Füge in src/app/app.module.ts den folgenden Code zur Importliste von AppModule hinzu:

@NgModule({
	declarations: [...],
	imports: [
		provideFirebaseApp(() =>  initializeApp(environment.firebase)),

		provideAuth(() => {
			const  auth = getAuth();
			if (location.hostname === 'localhost') {
				connectAuthEmulator(auth, 'http://127.0.0.1:9099', { disableWarnings:  true });
			}
			return  auth;
		}),

		provideFirestore(() => {
			const  firestore = getFirestore();
			if (location.hostname === 'localhost') {
				connectFirestoreEmulator(firestore, '127.0.0.1', 8080);
			}
			return  firestore;
		}),

		provideFunctions(() => {
			const  functions = getFunctions();
			if (location.hostname === 'localhost') {
				connectFunctionsEmulator(functions, '127.0.0.1', 5001);
			}
			return  functions;
		}),

		provideStorage(() => {
			const  storage = getStorage();
			if (location.hostname === 'localhost') {
				connectStorageEmulator(storage, '127.0.0.1', 5001);
			}
			return  storage;
		}),
		...
	]

Die App ist jetzt für die Verwendung lokaler Emulatoren konfiguriert, sodass Tests und Entwicklung lokal durchgeführt werden können.

6. Authentifizierung hinzufügen

Nachdem Emulatoren für die App eingerichtet wurden, können wir Authentifizierungsfunktionen hinzufügen, um dafür zu sorgen, dass jeder Nutzer angemeldet ist, bevor er Nachrichten postet.

Dazu können wir signin-Funktionen direkt aus AngularFire importieren und den Auth-Status des Nutzers mit der Funktion authState verfolgen. Ändern Sie die Funktionen der Anmeldeseite so, dass der Nutzerauthentifizierungsstatus beim Laden der Seite geprüft wird.

AngularFire Auth einfügen

Importieren Sie in src/app/pages/login-page/login-page.component.ts Auth aus @angular/fire/auth und fügen Sie es in LoginPageComponent ein. Authentifizierungsanbieter wie Google und Funktionen wiesignin und signout können auch direkt aus demselben Paket importiert und in der App verwendet werden.

import { Auth, GoogleAuthProvider, signInWithPopup, signOut, user } from  '@angular/fire/auth';

export  class  LoginPageComponent  implements  OnInit {
	private  auth: Auth = inject(Auth);
	private  provider = new  GoogleAuthProvider();
	user$ = user(this.auth);
	constructor() {}  

	ngOnInit(): void {} 

	login() {
		signInWithPopup(this.auth, this.provider).then((result) => {
			const  credential = GoogleAuthProvider.credentialFromResult(result);
			return  credential;
		})
	}

	logout() {
		signOut(this.auth).then(() => {
			console.log('signed out');}).catch((error) => {
				console.log('sign out error: ' + error);
		})
	}
}

Die Anmeldeseite funktioniert jetzt. Melden Sie sich an und sehen Sie sich die Ergebnisse im Authentifizierungs-Emulator an.

7. Firestore konfigurieren

In diesem Schritt fügen Sie Funktionen zum Posten und Aktualisieren von Reiseblogbeiträgen hinzu, die in Firestore gespeichert sind.

Ähnlich wie bei der Authentifizierung sind Firestore-Funktionen in AngularFire vorab enthalten. Jedes Dokument gehört zu einer Sammlung und jedes Dokument kann auch verschachtelte Sammlungen haben. Um einen Reiseblogbeitrag zu erstellen und zu aktualisieren, ist die path des Dokuments in Firestore erforderlich.

TravelService implementieren

Da viele verschiedene Seiten Firestore-Dokumente in der Web-App lesen und aktualisieren müssen, können wir die Funktionen in src/app/services/travel.service.ts implementieren, um zu vermeiden, dass dieselben AngularFire-Funktionen auf jeder Seite wiederholt eingefügt werden.

Beginnen Sie damit, Auth wie im vorherigen Schritt sowie Firestore in unseren Dienst einzufügen. Es ist auch hilfreich, ein beobachtbares user$-Objekt zu definieren, das auf den aktuellen Authentifizierungsstatus wartet.

import { doc, docData, DocumentReference, Firestore, getDoc, setDoc, updateDoc, collection, addDoc, deleteDoc, collectionData, Timestamp } from  "@angular/fire/firestore";

export  class  TravelService {
	firestore: Firestore = inject(Firestore);
	auth: Auth = inject(Auth);
	user$ = authState(this.auth).pipe(filter(user  =>  user !== null), map(user  =>  user!));
	router: Router = inject(Router);

Reisebeitrag hinzufügen

Reisebeiträge sind Dokumente, die in Firestore gespeichert werden. Da Dokumente in Sammlungen enthalten sein müssen, wird die Sammlung, die alle Reisebeiträge enthält, travels genannt. Der Pfad eines Reisebeitrags ist also travels/.

Mit der Funktion addDoc aus AngularFire kann ein Objekt in eine Sammlung eingefügt werden:

async  addEmptyTravel(userId: String) {
	...
	addDoc(collection(this.firestore, 'travels'), travelData).then((travelRef) => {
		collection(this.firestore, `travels/${travelRef.id}/stops`);
		setDoc(travelRef, {... travelData, id:  travelRef.id})
		this.router.navigate(['edit', `${travelRef.id}`]);
		return  travelRef;

	})
}

Daten aktualisieren und löschen

Anhand der UID eines beliebigen Reisebeitrags kann der Pfad des in Firestore gespeicherten Dokuments abgeleitet werden. Dieses kann dann mit den Funktionen updateFoc und deleteDoc von AngularFire gelesen, aktualisiert oder gelöscht werden:

async  updateData(path: string, data: Partial<Travel | Stop>) {
	await  updateDoc(doc(this.firestore, path), data)
}

async  deleteData(path: string) {
	const  ref = doc(this.firestore, path);
	await  deleteDoc(ref)
}

Daten als Observable lesen

Da Reisebeiträge und Zwischenstopps nach der Erstellung geändert werden können, wäre es sinnvoller, Dokumentobjekte als Observables zu erhalten, um alle Änderungen zu abonnieren. Diese Funktion wird von den Funktionen docData und collectionData aus @angular/fire/firestore bereitgestellt.

getDocData(path: string) {
	return  docData(doc(this.firestore, path), {idField:  'id'}) as  Observable<Travel | Stop>
}

  
getCollectionData(path: string) {
	return  collectionData(collection(this.firestore, path), {idField:  'id'}) as  Observable<Travel[] | Stop[]>
}

Zwischenstopps zu einem Reisebeitrag hinzufügen

Nachdem die Vorgänge für Reisebeiträge eingerichtet sind, ist es an der Zeit, Haltestellen zu berücksichtigen, die sich in einer Untergruppe eines Reisebeitrags befinden, z. B. so: travels//stops/

Das ist fast identisch mit dem Erstellen eines Reisebeitrags. Versuchen Sie also, es selbst zu implementieren, oder sehen Sie sich die Implementierung unten an:

async  addStop(travelId: string) {
	...
	const  ref = await  addDoc(collection(this.firestore, `travels/${travelId}/stops`), stopData)
	setDoc(ref, {...stopData, id:  ref.id})
}

Hört sich gut an. Die Firestore-Funktionen wurden im Reisedienst implementiert. Sie können sie sich jetzt in Aktion ansehen.

Firestore-Funktionen in der App verwenden

Rufen Sie src/app/pages/my-travels/my-travels.component.ts auf und fügen Sie TravelService ein, um die zugehörigen Funktionen zu verwenden.

travelService = inject(TravelService);
travelsData$: Observable<Travel[]>;
stopsList$!: Observable<Stop[]>;
constructor() {
	this.travelsData$ = this.travelService.getCollectionData(`travels`) as  Observable<Travel[]>
}

TravelService wird im Konstruktor aufgerufen, um ein Observable-Array aller Reisen abzurufen.

Wenn nur die Reisen des aktuellen Nutzers benötigt werden, verwenden Sie die query-Funktion.

Weitere Methoden zur Gewährleistung der Sicherheit sind die Implementierung von Sicherheitsregeln oder die Verwendung von Cloud Functions mit Firestore, wie in den optionalen Schritten unten beschrieben.

Rufen Sie dann einfach die in TravelService implementierten Funktionen auf.

async  createTravel(userId: String) {
	this.travelService.addEmptyTravel(userId);
}

deleteTravel(travelId: String) {
	this.travelService.deleteData(`travels/${travelId}`)
}

Die Seite „Meine Reisen“ sollte jetzt funktionieren. Sehen Sie sich an, was im Firestore-Emulator passiert, wenn Sie einen neuen Reisebeitrag erstellen.

Wiederholen Sie den Vorgang dann für die Aktualisierungsfunktionen in /src/app/pages/edit-travels/edit-travels.component.ts :

travelService: TravelService = inject(TravelService)
travelId = this.activatedRoute.snapshot.paramMap.get('travelId');
travelData$: Observable<Travel>;
stopsData$: Observable<Stop[]>;

constructor() {
	this.travelData$ = this.travelService.getDocData(`travels/${this.travelId}`) as  Observable<Travel>
	this.stopsData$ = this.travelService.getCollectionData(`travels/${this.travelId}/stops`) as  Observable<Stop[]>
}

updateCurrentTravel(travel: Partial<Travel>) {
	this.travelService.updateData(`travels${this.travelId}`, travel)
}

  

updateCurrentStop(stop: Partial<Stop>) {
	stop.type = stop.type?.toString();
	this.travelService.updateData(`travels${this.travelId}/stops/${stop.id}`, stop)
}

  

addStop() {
	if (!this.travelId) return;
	this.travelService.addStop(this.travelId);
}

deleteStop(stopId: string) {
	if (!this.travelId || !stopId) {
		return;
	}
	this.travelService.deleteData(`travels${this.travelId}/stops/${stopId}`)
	this.stopsData$ = this.travelService.getCollectionData(`travels${this.travelId}/stops`) as  Observable<Stop[]>

}

8. Speicher konfigurieren

Als Nächstes implementieren Sie Storage, um Bilder und andere Medientypen zu speichern.

Cloud Firestore eignet sich am besten zum Speichern strukturierter Daten wie JSON-Objekte. Cloud Storage ist für das Speichern von Dateien oder Blobs konzipiert. In dieser App verwenden Sie sie, um Nutzern die Möglichkeit zu geben, ihre Reisebilder zu teilen.

Wie bei Firestore ist zum Speichern und Aktualisieren von Dateien mit Storage eine eindeutige Kennung für jede Datei erforderlich.

Implementieren wir die Funktionen in TraveService:

Datei hochladen

Rufen Sie src/app/services/travel.service.ts auf und fügen Sie Storage aus AngularFire ein:

export  class  TravelService {
firestore: Firestore = inject(Firestore);
auth: Auth = inject(Auth);
storage: Storage = inject(Storage);

Implementieren Sie die Uploadfunktion:

async  uploadToStorage(path: string, input: HTMLInputElement, contentType: any) {
	if (!input.files) return  null
	const  files: FileList = input.files;
		for (let  i = 0; i  <  files.length; i++) {
			const  file = files.item(i);
			if (file) {
				const  imagePath = `${path}/${file.name}`
				const  storageRef = ref(this.storage, imagePath);
				await  uploadBytesResumable(storageRef, file, contentType);
				return  await  getDownloadURL(storageRef);
			}
		}
	return  null;
}

Der Hauptunterschied zwischen dem Zugriff auf Dokumente aus Firestore und auf Dateien aus Cloud Storage besteht darin, dass zwar beide Ordnerstrukturpfaden folgen, die Kombination aus Basis-URL und Pfad jedoch über getDownloadURL abgerufen wird, die dann in einer -Datei gespeichert und verwendet werden kann.

Funktion in der App verwenden

Rufen Sie src/app/components/edit-stop/edit-stop.component.ts auf und rufen Sie die Upload-Funktion mit folgendem Befehl auf:

	async  uploadFile(file: HTMLInputElement, stop: Partial<Stop>) {
	const  path = `/travels/${this.travelId}/stops/${stop.id}`
	const  url = await  this.travelService.uploadToStorage(path, file, {contentType:  'image/png'});
	stop.image = url ? url : '';
	this.travelService.updateData(path, stop);
}

Wenn das Bild hochgeladen wird, wird die Mediendatei selbst in den Speicher hochgeladen und die URL entsprechend im Dokument in Firestore gespeichert.

9. Anwendung bereitstellen

Jetzt können wir die Anwendung bereitstellen.

Kopieren Sie die firebase-Konfigurationen von src/environments/environment.ts nach src/environments/environment.prod.ts und führen Sie Folgendes aus:

firebase deploy

Auf dem Bildschirm sollte Folgendes zu sehen sein:

 Browser application bundle generation complete.
 Copying assets complete.
 Index html generation complete.

=== Deploying to 'friendly-travels-b6a4b'...

i  deploying storage, firestore, hosting
i  firebase.storage: checking storage.rules for compilation errors...
  firebase.storage: rules file storage.rules compiled successfully
i  firestore: reading indexes from firestore.indexes.json...
i  cloud.firestore: checking firestore.rules for compilation errors...
  cloud.firestore: rules file firestore.rules compiled successfully
i  storage: latest version of storage.rules already up to date, skipping upload...
i  firestore: deploying indexes...
i  firestore: latest version of firestore.rules already up to date, skipping upload...
  firestore: deployed indexes in firestore.indexes.json successfully for (default) database
i  hosting[friendly-travels-b6a4b]: beginning deploy...
i  hosting[friendly-travels-b6a4b]: found 6 files in .firebase/friendly-travels-b6a4b/hosting
  hosting[friendly-travels-b6a4b]: file upload complete
  storage: released rules storage.rules to firebase.storage
  firestore: released rules firestore.rules to cloud.firestore
i  hosting[friendly-travels-b6a4b]: finalizing version...
  hosting[friendly-travels-b6a4b]: version finalized
i  hosting[friendly-travels-b6a4b]: releasing new version...
  hosting[friendly-travels-b6a4b]: release complete

  Deploy complete!

Project Console: https://console.firebase.google.com/project/friendly-travels-b6a4b/overview
Hosting URL: https://friendly-travels-b6a4b.web.app

10. Glückwunsch!

Ihre Anwendung sollte jetzt fertig sein und in Firebase Hosting bereitgestellt werden. Alle Daten und Analysen sind jetzt in der Firebase Console verfügbar.

Weitere Informationen zu AngularFire, Functions und Sicherheitsregeln finden Sie in den optionalen Schritten unten sowie in anderen Firebase-Codelabs.

11. Optional: AngularFire-Authentifizierungs-Guards

Neben Firebase Authentication bietet AngularFire auch Authentifizierungs-Guards für Routen, sodass Nutzer mit unzureichendem Zugriff umgeleitet werden können. So wird die App vor Nutzern geschützt, die auf geschützte Daten zugreifen.

In src/app/app-routing.module.ts importieren

import {AuthGuard, redirectLoggedInTo, redirectUnauthorizedTo} from  '@angular/fire/auth-guard'

Anschließend können Sie Funktionen definieren, die festlegen, wann und wohin Nutzer auf bestimmten Seiten weitergeleitet werden sollen:

const  redirectUnauthorizedToLogin = () =>  redirectUnauthorizedTo(['signin']);
const  redirectLoggedInToTravels = () =>  redirectLoggedInTo(['my-travels']);

Fügen Sie sie dann einfach Ihren Routen hinzu:

const  routes: Routes = [
	{path:  '', component:  LoginPageComponent, canActivate: [AuthGuard], data: {authGuardPipe:  redirectLoggedInToTravels}},
	{path:  'signin', component:  LoginPageComponent, canActivate: [AuthGuard], data: {authGuardPipe:  redirectLoggedInToTravels}},
	{path:  'my-travels', component:  MyTravelsComponent, canActivate: [AuthGuard], data: {authGuardPipe:  redirectUnauthorizedToLogin}},
	{path:  'edit/:travelId', component:  EditTravelsComponent, canActivate: [AuthGuard], data: {authGuardPipe:  redirectUnauthorizedToLogin}},
];

12. Optional: Sicherheitsregeln

Sowohl Firestore als auch Cloud Storage verwenden Sicherheitsregeln (firestore.rules bzw. security.rules), um die Sicherheit zu gewährleisten und Daten zu validieren.

Derzeit haben Sie offenen Lese- und Schreibzugriff auf die Firestore- und Storage-Daten, aber Sie möchten nicht, dass andere die Beiträge anderer Nutzer ändern. Mit Sicherheitsregeln können Sie den Zugriff auf Ihre Sammlungen und Dokumente einschränken.

Firestore-Regeln

Wenn nur authentifizierte Nutzer Reisebeiträge sehen sollen, fügen Sie der firestore.rules-Datei Folgendes hinzu:

rules_version  =  '2';
service  cloud.firestore  {
	match  /databases/{database}/travels  {
		allow  read:  if  request.auth.uid  !=  null;
		allow  write:
		if  request.auth.uid  ==  request.resource.data.userId;
	}
}

Sicherheitsregeln können auch zum Validieren von Daten verwendet werden:

rules_version  =  '2';
service  cloud.firestore  {
	match  /databases/{database}/posts  {
		allow  read:  if  request.auth.uid  !=  null;
		allow  write:
		if  request.auth.uid  ==  request.resource.data.userId;
		&&  "author"  in  request.resource.data
		&&  "text"  in  request.resource.data
		&&  "timestamp"  in  request.resource.data;
	}
}

Speicherregeln

In ähnlicher Weise können wir Sicherheitsregeln verwenden, um den Zugriff auf Speicherdatenbanken in storage.rules zu erzwingen. Für komplexere Prüfungen können auch Funktionen verwendet werden:

rules_version  =  '2';

function  isImageBelowMaxSize(maxSizeMB)  {
	return  request.resource.size  <  maxSizeMB  *  1024  *  1024
		&&  request.resource.contentType.matches('image/.*');
}

 service  firebase.storage  {
	match  /b/{bucket}/o  {
		match  /{userId}/{postId}/{filename}  {
			allow  write:  if  request.auth  !=  null
			&&  request.auth.uid  ==  userId  &&  isImageBelowMaxSize(5);
			allow  read;
		}
	}
}