데이터 연결의 Common Expression Language 구문 참조

이 참조 가이드에서는 @auth(expr:)@check(expr:) 지시문의 표현식을 만드는 것과 관련된 Common Expression Language (CEL) 문법을 다룹니다.

CEL에 관한 전체 참조 정보는 CEL 사양에 나와 있습니다.

쿼리 및 변형에 전달된 테스트 변수

@auth(expr) 구문을 사용하면 쿼리 및 변형에서 변수에 액세스하고 테스트할 수 있습니다.

예를 들어 vars.status를 사용하여 $status와 같은 작업 변수를 포함할 수 있습니다.

mutation Update($id: UUID!, $status: Any) @auth(expr: "has(vars.status)")

표현식에 사용할 수 있는 데이터

@auth(expr:)@check(expr:) CEL 표현식은 모두 다음을 평가할 수 있습니다.

  • request.operationName
  • vars (request.variables의 별칭)
  • auth (request.auth의 별칭)

또한 @check(expr:) 표현식은 다음을 평가할 수 있습니다.

  • this (현재 필드의 값)

request.operationName 객체

request.operarationName 객체는 작업 유형(쿼리 또는 변형)을 저장합니다.

vars 객체

vars 객체를 사용하면 표현식이 쿼리 또는 변형에 전달된 모든 변수에 액세스할 수 있습니다.

표현식에서 vars.<variablename>를 정규화된 request.variables.<variablename>의 별칭으로 사용할 수 있습니다.

# The following are equivalent
mutation StringType($v: String!) @auth(expr: "vars.v == 'hello'")
mutation StringType($v: String!) @auth(expr: "request.variables.v == 'hello'")

auth 객체

Authentication는 데이터 액세스를 요청하는 사용자를 식별하고 해당 정보를 표현식에서 빌드할 수 있는 객체로 제공합니다.

필터와 표현식에서 authrequest.auth의 별칭으로 사용할 수 있습니다.

auth 객체에는 다음 정보가 포함됩니다.

  • uid: 요청하는 사용자에게 할당된 순 사용자 ID입니다.
  • token: Authentication에서 수집한 값의 맵입니다.

auth.token의 콘텐츠에 관한 자세한 내용은 인증 토큰의 데이터를 참고하세요.

this 바인딩

바인딩 this@check 디렉티브가 연결된 필드로 평가됩니다. 기본적인 경우 단일 값 쿼리 결과를 평가할 수 있습니다.

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
  })
}

조상이 목록이므로 반환된 필드가 여러 번 발생하는 경우 각 값에 바인딩된 this를 사용하여 각 어커런스를 테스트합니다.

특정 경로의 경우 조상이 null 또는 []이면 필드에 도달하지 못하며 해당 경로의 CEL 평가가 건너뜁니다. 즉, thisnull이거나 null가 아닌 경우에만 평가가 실행되며 undefined인 경우는 없습니다.

필드 자체가 목록 또는 객체인 경우 this는 다음 예와 같이 동일한 구조(객체의 경우 선택된 모든 하위 요소 포함)를 따릅니다.

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
  })
}

복잡한 표현식 문법

&&|| 연산자와 결합하여 더 복잡한 표현식을 작성할 수 있습니다.

mutation UpsertUser($username: String!) @auth(expr: "(auth != null) && (vars.username == 'joe')")

다음 섹션에서는 사용 가능한 모든 연산자를 설명합니다.

연산자 및 연산자 우선순위

다음 표를 통해 연산자와 연산자 우선순위를 참고하세요.

ab, 필드 f, 색인 i는 임의로 주어진 표현식입니다.

연산자 설명 결합
a[i] a() a.f 색인, 호출, 필드 액세스 왼쪽에서 오른쪽으로
!a -a 단항 부정 오른쪽에서 왼쪽으로
a/b a%b a*b 곱셈 연산자 왼쪽에서 오른쪽으로
a+b a-b 덧셈 연산자 왼쪽에서 오른쪽으로
a>b a>=b a<b a<=b 관계 연산자 왼쪽에서 오른쪽으로
a in b 목록 또는 맵에 존재 왼쪽에서 오른쪽으로
type(a) == t 유형 비교: t은 bool, int, float, number, string, list, map, timestamp, duration일 수 있습니다. 왼쪽에서 오른쪽으로
a==b a!=b 비교 연산자 왼쪽에서 오른쪽으로
a && b 조건부 AND 왼쪽에서 오른쪽으로
a || b 조건부 OR 왼쪽에서 오른쪽으로
a ? true_value : false_value 3항 표현식 왼쪽에서 오른쪽으로

인증 토큰의 데이터

auth.token 객체는 다음 값을 포함할 수 있습니다.

필드 설명
email 계정과 연결된 이메일 주소(있는 경우)입니다.
email_verified true는 사용자가 email 주소에 대한 액세스 권한이 있는지 확인한 경우입니다. 일부 제공업체는 자동으로 자체 이메일 주소를 확인합니다.
phone_number 계정과 연결된 전화번호(있는 경우)입니다.
name 사용자의 표시 이름(설정된 경우)입니다.
sub 사용자의 Firebase UID입니다. 프로젝트 내에서 고유합니다.
firebase.identities 사용자 계정과 연결된 모든 ID의 사전입니다. 사전의 키는 email, phone, google.com, facebook.com, github.com, twitter.com일 수 있습니다. 사전의 값은 계정과 연결된 각 ID 공급업체의 고유한 식별자 배열입니다. 예를 들어 auth.token.firebase.identities["google.com"][0]에는 계정과 연결된 첫 번째 Google 사용자 ID가 포함됩니다.
firebase.sign_in_provider 토큰을 얻기 위해 사용된 로그인 제공업체입니다. 문자열 custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com 중 하나일 수 있습니다.
firebase.tenant 계정과 연결된 tenantId(있는 경우)입니다. 예를 들면 tenant2-m6tyz입니다.

JWT ID 토큰의 추가 필드

다음 auth.token 필드에도 액세스할 수 있습니다.

커스텀 토큰 클레임
alg 알고리즘 "RS256"
iss 발급자 프로젝트의 서비스 계정 이메일 주소
sub 제목 프로젝트의 서비스 계정 이메일 주소
aud 잠재고객 "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat 발급 시간 Unix epoch를 기준으로 하는 현재 시간(초)
exp 만료 시간 Unix epoch를 기준으로 하는 토큰 만료 시간(초). iat보다 최대 3,600초 길어질 수 있습니다.
참고: 이 항목은 커스텀 토큰 자체의 만료 시간만 제어합니다. signInWithCustomToken()으로 사용자가 로그인한 후에는 세션이 무효화되거나 사용자가 로그아웃할 때까지 기기에서 로그인 상태가 유지됩니다.
<claims>(선택사항) 토큰에 포함할 선택적 맞춤 클레임으로, 표현식에서 auth.token (또는 request.auth.token)를 통해 액세스할 수 있습니다. 예를 들어 맞춤 소유권 주장 adminClaim을 만드는 경우 auth.token.adminClaim로 액세스할 수 있습니다.