이 참조 가이드에서는 @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는 데이터 액세스를 요청하는 사용자를 식별하고 해당 정보를 표현식에서 빌드할 수 있는 객체로 제공합니다.
필터와 표현식에서 auth
를 request.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 평가가 건너뜁니다. 즉, this
이 null
이거나 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')")
다음 섹션에서는 사용 가능한 모든 연산자를 설명합니다.
연산자 및 연산자 우선순위
다음 표를 통해 연산자와 연산자 우선순위를 참고하세요.
a
및 b
, 필드 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 로 액세스할 수 있습니다.
|