In diesen Referenzleitfäden wird die CEL-Syntax (Common Expression Language) behandelt, die für das Erstellen von Ausdrücken für die Direktiven @auth(expr:)
und @check(expr:)
relevant ist.
Vollständige Referenzinformationen zu CEL finden Sie in der CEL-Spezifikation.
Testvariablen, die in Abfragen und Mutationen übergeben werden
Mit der @auth(expr)
-Syntax können Sie auf Variablen aus Abfragen und Mutationen zugreifen und sie testen.
Sie können beispielsweise eine Vorgangsvariable wie $status
mit vars.status
einfügen.
mutation Update($id: UUID!, $status: Any) @auth(expr: "has(vars.status)")
Für Ausdrücke verfügbare Daten
Sowohl @auth(expr:)
als auch @check(expr:)
können CEL-Ausdrücke für Folgendes auswerten:
request.operationName
vars
(Alias fürrequest.variables
)auth
(Alias fürrequest.auth
)
Außerdem können @check(expr:)
-Ausdrücke Folgendes auswerten:
this
(Wert des aktuellen Felds)
Das Objekt „request.operationName“
Im request.operarationName
-Objekt wird der Vorgangstyp gespeichert, also „Abfrage“ oder „Mutation“.
Das vars
-Objekt
Über das vars
-Objekt können Ihre Ausdrücke auf alle Variablen zugreifen, die in Ihrer Abfrage oder Mutation übergeben wurden.
Sie können vars.<variablename>
in einem Ausdruck als Alias für die vollständige request.variables.<variablename>
verwenden:
# The following are equivalent
mutation StringType($v: String!) @auth(expr: "vars.v == 'hello'")
mutation StringType($v: String!) @auth(expr: "request.variables.v == 'hello'")
Das auth
-Objekt
Authentication identifiziert Nutzer, die Zugriff auf Ihre Daten anfordern, und stellt diese Informationen als Objekt bereit, auf das Sie in Ihren Ausdrücken aufbauen können.
In Ihren Filtern und Ausdrücken können Sie auth
als Alias für request.auth
verwenden.
Das Auth-Objekt enthält die folgenden Informationen:
uid
: Eine eindeutige Nutzer-ID, die dem anfragenden Nutzer zugewiesen ist.token
: Eine Zuordnungstabelle der von Authentication erfassten Werte.
Weitere Informationen zum Inhalt von auth.token
finden Sie unter Daten in Auth-Tokens.
Die this
-Bindung
Die Bindung this
wird auf das Feld angewendet, an das die Anweisung @check
angehängt ist. In einem einfachen Fall können Sie Ergebnisse von Abfragen mit nur einem Wert auswerten.
mutation UpdateMovieTitle($movieId: UUID!, $newTitle: String!) @auth(level: USER) @transaction {
# Step 1: Query and check
query @redact {
moviePermission( # Look up a join table called MoviePermission with a compound key.
key: {movieId: $movieId, userId_expr: "auth.uid"}
) {
# Check if the user has the editor role for the movie. `this` is the string value of `role`.
# If the parent moviePermission is null, the @check will also fail automatically.
role @check(expr: "this == 'editor'", message: "You must be an editor of this movie to update title")
}
}
# Step 2: Act
movie_update(id: $movieId, data: {
title: $newTitle
})
}
Wenn das zurückgegebene Feld mehrmals vorkommt, weil ein Vorfahr eine Liste ist, wird jedes Vorkommen mit this
getestet, das an jeden Wert gebunden ist.
Wenn ein Vorfahr eines bestimmten Pfades null
oder []
ist, wird das Feld nicht erreicht und die CEL-Bewertung für diesen Pfad übersprungen. Mit anderen Worten: Die Auswertung erfolgt nur, wenn this
null
oder nicht null
ist, aber nie undefined
.
Wenn das Feld selbst eine Liste oder ein Objekt ist, folgt this
derselben Struktur (einschließlich aller ausgewählter Abkömmlinge bei Objekten), wie im folgenden Beispiel dargestellt.
mutation UpdateMovieTitle2($movieId: UUID!, $newTitle: String!) @auth(level: USER) @transaction {
# Step 1: Query and check
query {
moviePermissions( # Now we query for a list of all matching MoviePermissions.
where: {movieId: {eq: $movieId}, userId: {eq_expr: "auth.uid"}}
# This time we execute the @check on the list, so `this` is the list of objects.
# We can use the `.exists` macro to check if there is at least one matching entry.
) @check(expr: "this.exists(p, p.role == 'editor')", message: "You must be an editor of this movie to update title") {
role
}
}
# Step 2: Act
movie_update(id: $movieId, data: {
title: $newTitle
})
}
Syntax komplexer Ausdrücke
Sie können komplexere Ausdrücke formulieren, indem Sie sie mit den Operatoren &&
und ||
kombinieren.
mutation UpsertUser($username: String!) @auth(expr: "(auth != null) && (vars.username == 'joe')")
Im folgenden Abschnitt werden alle verfügbaren Operatoren beschrieben.
Operatoren und Operatorrangfolge
In der folgenden Tabelle finden Sie eine Übersicht über die Operatoren und ihre jeweilige Priorität.
Es sind beliebige Ausdrücke a
und b
, ein Feld f
und ein Index i
gegeben.
Operator | Beschreibung | Assoziativität |
---|---|---|
a[i] a() a.f |
Index, Aufruf, Feldzugriff | von links nach rechts |
!a -a |
Unäre Negation | von rechts nach links |
a/b a%b a*b |
Multiplikative Operatoren | von links nach rechts |
a+b a-b |
Additivoperatoren | von links nach rechts |
a>b a>=b a<b a<=b |
Relationale Operatoren | von links nach rechts |
a in b |
Vorhandensein in Liste oder Karte | von links nach rechts |
type(a) == t |
Typvergleich, wobei t „bool“, „int“, „float“, „number“, „string“, „list“, „map“, „timestamp“ oder „duration“ sein kann |
von links nach rechts |
a==b a!=b |
Vergleichsoperatoren | von links nach rechts |
a && b |
Bedingtes AND | von links nach rechts |
a || b |
Bedingtes ODER | von links nach rechts |
a ? true_value : false_value |
Ternärer Ausdruck | von links nach rechts |
Daten in Auth-Tokens
Das auth.token
-Objekt kann die folgenden Werte enthalten:
Feld | Beschreibung |
---|---|
email |
Die mit dem Konto verknüpfte E-Mail-Adresse, sofern vorhanden. |
email_verified |
true , wenn der Nutzer bestätigt hat, dass er Zugriff auf die email -Adresse hat. Einige Anbieter bestätigen E-Mail-Adressen, die ihnen gehören, automatisch. |
phone_number |
Die mit dem Konto verknüpfte Telefonnummer, falls vorhanden. |
name |
Der Anzeigename des Nutzers, falls festgelegt. |
sub |
Die Firebase-UID des Nutzers. Dieser Wert ist innerhalb eines Projekts eindeutig. |
firebase.identities |
Wörterbuch aller Identitäten, die mit dem Konto dieses Nutzers verknüpft sind. Die Schlüssel des Wörterbuchs können einen der folgenden Werte haben: email , phone , google.com , facebook.com , github.com oder twitter.com . Die Werte des Wörterbuchs sind Arrays eindeutiger IDs für jeden Identitätsanbieter, der mit dem Konto verknüpft ist. auth.token.firebase.identities["google.com"][0] enthält beispielsweise die erste Google-Nutzer-ID, die mit dem Konto verknüpft ist. |
firebase.sign_in_provider |
Der Anmeldeanbieter, der zum Abrufen dieses Tokens verwendet wurde. Kann einer der folgenden Strings sein: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com . |
firebase.tenant |
Die mit dem Konto verknüpfte „tenantId“, falls vorhanden. Beispiel: tenant2-m6tyz |
Zusätzliche Felder in JWT-ID-Tokens
Sie können auch auf die folgenden auth.token
-Felder zugreifen:
Benutzerdefinierte Token-Anforderungen | ||
---|---|---|
alg |
Algorithmus | "RS256" |
iss |
Aussteller | Die E-Mail-Adresse des Dienstkontos Ihres Projekts |
sub |
Betreff | Die E-Mail-Adresse des Dienstkontos Ihres Projekts |
aud |
Zielgruppe | "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit" |
iat |
Ausstellungszeit | Die aktuelle Zeit in Sekunden seit der UNIX-Epoche |
exp |
Ablaufzeit |
Die Zeit in Sekunden seit der UNIX-Epoche, zu der das Token abläuft. Dies kann maximal 3.600 Sekunden später als iat sein.
Beachten Sie, dass damit nur der Zeitpunkt gesteuert wird, zu dem das benutzerdefinierte Token selbst abläuft. Wenn Sie jedoch einen Nutzer mit signInWithCustomToken() anmelden, bleiben er so lange auf dem Gerät angemeldet, bis die Sitzung ungültig wird oder der Nutzer sich abmeldet.
|
<claims> (optional) |
Optionale benutzerdefinierte Ansprüche, die in das Token aufgenommen werden sollen. Auf diese kann in Ausdrücken über auth.token (oder request.auth.token ) zugegriffen werden. Wenn du beispielsweise einen benutzerdefinierten Anspruch adminClaim erstellst, kannst du über auth.token.adminClaim darauf zugreifen.
|