1

У меня есть эти требования:Как скрыть информацию в Firebase?

  1. Пользователь будет войти по электронной почте и нескольких поставщиков OAuth. Я использую функцию как User.findByEmail('[email protected]'). Поэтому мне нужно иметь разрешение видеть список пользователей до аутентификации.
  2. Адрес электронной почты пользователя, геолокация и возраст должны храниться в тайне от других пользователей.

Мой первый план:

users:{ 
    $user-id:{ 

// public 
    ".read" : true, 
    name, 
    created_at, 

    private: { 
     ".read" : "auth.email === data.child('email').val()", 
     age, 
     email, 
     geolocation, 
    } 
    $piority = email 
    } 
} 

Тогда я понял, нет, он просто не работает. Так кто-нибудь, пожалуйста, скажите мне, как это сделать правильно? Заранее спасибо.

P.S. Firebase действительно нуждается в методе filter/serialize.

+1

это звучит, как вам нужно «суперадминистратор» роли пользователя ... Почему бы вы нужен список всех пользователей? Почему пользователь не может войти первым, а затем получить доступ к его собственным данным? –

+0

Хороший вопрос. Ну в форме регистрации я установил его, чтобы проверить, существует ли электронная почта, когда адрес электронной почты «на размытие». Кроме того, пользователи действительно всегда подписываются с помощью 'Auth' перед использованием' User.findByEmail() '. Однако реальная проблема заключается в том, что после того, как пользователь получил 'Auth', ему нужно загрузить текущего пользователя из таблицы« Пользователь ». В таблице User используется идентификатор пользователя как ключевой и адрес электронной почты как приоритет. Поэтому я должен использовать запрос 'equalTo' для получения' User.findByEmail() '. Если я скрою некоторую информацию в User, я запретил бы запрос 'equalTo'. –

+0

Ну, если электронная почта пользователя является основным ключом для доступа к пользовательским данным, почему бы вам не использовать электронную почту вместо $ user-id. –

ответ

4

В этом посте действительно несколько вопросов. Во-первых, как хранить личные данные. Одним из простых изменений, которые вы можете сделать, является инвертирование общедоступных/частных и пользовательских ключей - они не должны быть вложены в одну и ту же запись пользователя.

/users/$user_id/...public data... 
/private/$user_id/...private data... 

Это упрощает сбор данных.

Другой вопрос касается дублирования обнаружения электронной почты. Если мы предположим, что вы используете простой логин здесь, все это довольно спорный вопрос. Вы можете проверить, существует ли адрес электронной почты, просто создав учетную запись. Ошибка будет возвращена, если электронная почта уже зарегистрирована.

Если это не решит проблему, вы все равно можете проверить это вручную, не предоставляя список электронных писем пользователей. Обычно это делается с индексом. Когда новый аккаунт создан, написать что-то вроде этого:

/email_index/$escaped_email/$userid ($userid is the value) 

Теперь, когда вы хотите проверить, если электронная почта доступна, вы прочитанный так:

var ref = new Firebase(URL); 
function checkEmail(emailAddress, callback) { 
    ref.child('email_index/'+escapeEmail(emailAddress)).once('value', function(snap) { 
     callback(snap.val() !== null); 
    }); 
} 

function escapeEmail(emailAddress) { 
    return (email || '').replace('.', ','); 
} 

checkEmail(EMAIL_ADDRESS, function(exists) { 
    console.log(EMAIL_ADDRESS + (exists? 'does' : 'does not') + ' exist!'); 
}); 

Чтобы кто-то из списка электронные письма, вы делаете что-то подобное в вашей (удивительно гибкий и действительно очень сложный, даже для корпоративных приложений) правил безопасности:

"email_index": { 
    // no .read rule here means that the data cannot be listed; I have to know the email address to check it 
    "$email_address": { 
     ".read": true, 
     // it can only be claimed once and the value must be my user id 
     ".write": "auth.uid === newData.val() && !data.exists()" 
    } 
} 
+0

Спасибо, это очень хороший ответ. –

+0

Только одно: каким должно быть правило безопасности для ' /public/$user_id/...public data ... '' s 'write'? Обратите внимание, что он не будет иметь адрес электронной почты в общедоступных данных. –

+1

Возможно, что-то вроде« auth.uid === $ user_id »? – Kato

Смежные вопросы