В базе данных firestore я использую электронную почту только как аутентификацию. База данных имеет следующую структуру:
companies
jobs
users
Для удобства чтения (и для удобства клиентов) я использую адрес электронной почты в качестве идентификатора документа для коллекции users
. Документ user
выглядит следующим образом:
document id: tbogard@gmail.com
fields
name_first: Terry
name_last: Bogard
jobs_read: ["job_A"]
jobs_readwrite: ["job_B, job_C"]
Когда я пытаюсь получить токен запроса в правилах, он выдает ошибки (поиск ***):
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Helper functions
function userExists(){
// *** Function not found error: Name: [exists]. ***
return exists(/databases/$(database)/documents/users/$(request.auth.token.email));
}
function userData(){
// *** Function [get] called with malformed path: /databases/(default)/documents/users/ ***
return get(/databases/$(database)/documents/users/$(request.auth.token.email)).data;
}
// For now, let's keep it simple, and enforce the User read/readwrite rules on Jobs.
match /jobs/{jobId}{
allow read: if userExists() && (jobId in userData().jobs_read || jobId in userData().jobs_readwrite);
allow write: if userExists() && jobId in userData().jobs_readwrite;
}
// Only allow Users to see their own profile and companies they belong to.
match /companies/{companyId}{
allow read: if userExists() && userData().email in resource.data.employees;
allow write: if false;
}
match /users/{userId}{
allow read: if userExists() && userData().email == resource.data.email;
allow write: if false;
}
}
}
Я думаю, request.auth.token.email
возвращает что-то вроде необязательного? Я не могу найти ничего в документации , объясняющей, как функции get/exists
, требующие пути, справляются с этим. Есть ли способ, которым я мог бы сделать UID Firestore для каждого пользователя адресом электронной почты вместо случайной строки, или я могу как-то исправить эти правила?