이 참조 가이드에서는 @auth(expr:) 및 @check(expr:) 디렉터리브의 표현식을 만드는 데 관련된 CEL (Common Expression Language) 문법을 다룹니다.
CEL에 대한 전체 참조 정보는 CEL 사양에 제공됩니다.
쿼리 및 변경에 전달된 테스트 변수
@auth(expr) 문법을 사용하면 쿼리 및 변경에서 변수에 액세스하고 테스트할 수 있습니다.
예를 들어 vars.status를 사용하여 $status와 같은 작업 변수를 포함할 수 있습니다.
mutation Update($id: UUID!, $status: Any) @auth(expr: "has(vars.status)")
표현식에 사용할 수 있는 데이터: request, response, this
다음과 같은 용도로 데이터를 사용합니다.
@auth(expr:)및@check(expr:)디렉터리브의 CEL 표현식으로 평가- 서버 표현식
<field>_expr을 사용하여 할당
@auth(expr:) 및 @check(expr:) CEL 표현식은 다음을 평가할 수 있습니다.
request.operationNamevars(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으로 액세스할 수 있습니다.
|
|