tldr: Я не думаю, что это возможно, без запуска вашего собственного сервера.
Вот моя попытка:
{
"rules": {
".read": "auth.provider === 'google' && root.child('users').child(auth.uid).child('email').val().endsWith('@foobar.com')",
".write": "auth.provider === 'google' && root.child('users').child(auth.uid).child('email').val().endsWith('@foobar.com')",
"users": {
"$user_id": {
".write": "auth.provider === 'google' && $user_id === auth.uid && newData.child('email').val().endsWith('@foobar.com')"
}
}
}
}
Я считаю, что вышеизложенное говорит, что «разрешить людям создавать нового пользователя, если они аутентифицированы Google, пытаются записать в узел базы данных для них ($user_id === auth.uid
), а их адрес электронной почты заканчивается на foobar.com».
Однако была отмечена проблема: любой веб-клиент может легко изменить свою электронную почту (используя консоль dev) до отправки сообщения в Firebase. Таким образом, мы не можем доверять данным пользовательской записи при их хранении в Firebase.
Я думаю, что единственное, на что мы можем действительно доверять, - это объект auth
в правилах. Этот объект auth
заполняется бэкэндом Firebase. И, к сожалению, объект auth
не включает адрес электронной почты.
Для записи я вставляю своего пользователя таким образом:
function authDataCallback(authData) {
if (authData) {
console.log("User " + authData.uid + " is logged in with " + authData.provider + " and has displayName " + authData.google.displayName);
// save the user's profile into the database so we can list users,
// use them in Security and Firebase Rules, and show profiles
ref.child("users").child(authData.uid).set({
provider: authData.provider,
name: getName(authData),
email: authData.google.email
});
Как вы могли бы для представления, определенный пользователь мог бы перезаписать здесь значение email
(например, с помощью DevTools).