Firebase Cloud Function beforeSignIn()?
Guten Morgen,
ich bastle grade an einer kleinen vue Web App. In dieser App kann man sich über die Firebase Api mit jedem Google Account anmelden.
Nun möchte ich aber nicht den gesamten Seiteninhalt mit jedem Google Nutzer teilen.
Ich habe mir gedacht, dass ich im Firestore eine Tabelle mit freigeschalteten Nutzer erstelle (uid, email, role). Hier füge ich auch eine Rolle hinzu, um später mehr oder weniger Zugriffe auf der Seite zu erlauben.
In Firebase gibt es die Cloud Function beforeSignIn().. kann ich diese nutzen, um bei jeder Anmeldung zu überprüfen, ob der jeweilige Nutzer mit der jeweiligen Email Adresse in meiner Firestore Datenbank vorhanden ist und dann an das firebase.getAuth().currentUser model die jeweiligen daten anhängen?
Das user Objekt sollte dann folgendermaßen ausshen:
{
"uid": "...",
"email": "...@.....",
"emailVerified": true,
"displayName": "...",
"isAnonymous": false,
"photoURL": "https://lh3.goo.....",
// durch beforeSignIn() aus DB hinzugefügt
"isValid": true,
"role": "admin"
....
}
Später kann ich dann im vue-router die isValid und role Eigenschaft überprüfen.
Ist das so möglich und einigermaßen sinnvoll?
Ich hoffe mir kann jemand helfen.
LG Tom!
##### ES FUNKTIONIERT #####
Für alle, die etwas Ähnliches vorhaben.
Folgende Google Cloud Function fügt benutzerdefinierte Werte zu dem User Objekt bzw. zu dem idToken des Users hinzu:
exports.beforeSignIn = functions.region('europe-west3').auth.user().beforeSignIn((user, context) => {
let customClaims = {
isVerified: true,
role: 'admin'
}
getAuth().setCustomUserClaims(user.uid, customClaims);
});
Im Client können diese Werte dann wie folgt ausgelesen werden:
import { auth } from "../firebase/";
let user = auth.currentUser
let idTokenResult = await user.getIdTokenResult(true);
console.log(idTokenResult.claims)
Ich hoffe, dass das ganze noch jemandem hilft.
1 Antwort
Wenn du die Identity Platform-Authentifizierung von Firebase nutzt, und hierbei auf keine anonyme oder benutzerdefinierte Authentifizierungsweise zurückgreifst, kannst du Blockierfunktionen verwenden.
Ein konkretes Beispiel, wie sich Nutzer bei Anmeldung blockieren lassen, zeigt bereits die Dokumentation. Die Anfrage deines Client SDK würde eine entsprechende Fehlerinformation im Response erhalten (passend wäre z.B. Statuscode 403), die du in deiner Vue-Anwendung weiterverarbeiten kannst.
Okay, habs grade selbst gemerkt.. da es ne asynchrone Funktion ist, kann er die Claims im log natürlich nicht sofort ausgeben.
Dennoch werden die customClaimes nicht im userObjekt an meinen Client weitergegeben. gibt es da eine Möglichkeit, die im Client auszulesen?
Vielen Dank für die Antwort. Ich habe mich mit der ganzen Thematik nochmal weiter auseinander gesetzt und die theoretische Möglichkeit von customClaims gefunden.
Soweit ich es verstanden habe, kann ich im signin oder create Process eines Nutzers einschreiten und über das customClaims Attribut beliebige Werte speichern und später abfragen lassen.
Firebase Dokumentation Custom Claims
https://firebase.google.com/docs/auth/admin/custom-claims
Die Funktion habe ich so auch getestet. Leider ohne Erfolg. Sie wird ausgeführt, setzt jedoch keine claims.
Ich habe das ganze in zahlreichen Varianten getestet und auch diese super stark runtergebrochene Version funktioniert nicht.
Die Variable customClaims gibt immer undefined zurück.
was mache ich da falsch?