이 참조 가이드에서는 @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)")
표현식에 사용할 수 있는 데이터: 요청, 응답, this
데이터를 다음 용도로 사용합니다.
@auth(expr:)
및@check(expr:)
디렉티브에서 CEL 표현식으로 평가- 서버 표현식
<field>_expr
을 사용한 할당
@auth(expr:)
및 @check(expr:)
CEL 표현식은 모두 다음을 평가할 수 있습니다.
request.operationName
vars
(request.variables
의 별칭)auth
(request.auth
의 별칭)
변형에서 다음의 콘텐츠에 액세스하고 할당할 수 있습니다.
response
(다단계 로직에서 일부 결과를 확인하기 위해 사용)
또한 @check(expr:)
표현식은 다음을 평가할 수 있습니다.
this
(현재 필드의 값)response
(다단계 로직에서 일부 결과를 확인하기 위해 사용)
request.operationName 결합
request.operarationName
결합은 쿼리 또는 변형 중 하나인 작업 유형을 저장합니다.
vars
결합 (request.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
결합 (request.auth)
Authentication는 데이터 액세스를 요청하는 사용자를 식별하고 해당 정보를 표현식에서 빌드할 수 있는 바인딩으로 제공합니다.
필터와 표현식에서 auth
를 request.auth
의 별칭으로 사용할 수 있습니다.
인증 결합에는 다음 정보가 포함됩니다.
uid
: 요청하는 사용자에게 할당된 순 사용자 ID입니다.token
: Authentication에서 수집한 값의 맵입니다.
auth.token
의 콘텐츠에 관한 자세한 내용은 인증 토큰의 데이터를 참고하세요.
response
바인딩
response
결합에는 쿼리 또는 변형에 대한 응답으로 서버에서 조합 중인 데이터가 조합되는 대로 포함됩니다.
작업이 진행되고 각 단계가 성공적으로 완료되면 response
에는 성공적으로 완료된 단계의 응답 데이터가 포함됩니다.
response
결합은 중첩된 (여러 개의) 필드와 (해당하는 경우) 삽입된 쿼리를 비롯하여 연결된 작업의 모양에 따라 구성됩니다.
삽입된 쿼리 응답 데이터에 액세스할 때는 삽입된 쿼리에서 요청된 데이터에 따라 필드에 임의의 데이터 유형이 포함될 수 있습니다. _insert
및 _delete
와 같은 변형 필드에서 반환된 데이터에 액세스할 때는 UUID 키, 삭제 수, null이 포함될 수 있습니다 (변형 참조 참고).
예를 들면 다음과 같습니다.
- 삽입된 쿼리가 포함된 변형에서
response
결합에는response.query.<fieldName>.<fieldName>....
의 조회 데이터(이 경우response.query.todoList
및response.query.todoList.priority
)가 포함됩니다.
mutation CheckTodoPriority(
$uniqueListName: String!
) {
# This query is identified as `response.query`
query @check(expr: "response.query.todoList.priority == 'high'", message: "This list is not for high priority items!") {
# This field is identified as `response.query.todoList`
todoList(where: { name: $uniqueListName }) {
# This field is identified as `response.query.todoList.priority`
priority
}
}
}
- 다단계 변형(예: 여러 개의
_insert
필드 포함)에서response
결합에는response.<fieldName>.<fieldName>....
(이 경우response.todoList_insert.id
)에 부분 데이터가 포함됩니다.
mutation CreateTodoListWithFirstItem(
$listName: String!,
$itemContent: String!
) @transaction {
# Step 1
todoList_insert(data: {
id_expr: "uuidV4()",
name: $listName,
})
# Step 2:
todo_insert(data: {
listId_expr: "response.todoList_insert.id" # <-- Grab the newly generated ID from the partial response so far.
content: $itemContent,
})
}
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 로 액세스할 수 있습니다.
|