Я застрял в этой проблеме уже много часов, поэтому любая помощь приветствуется. Попытка сделать приложение для Android с Firebase для аутентификации пользователей (простой адрес электронной почты и пароль) вместе с уникальными именами пользователей. У меня есть мои Регистраций экран поля выложена на одном экране, например:Firebase проверяет, существует ли значение без чтения моментального снимка или попытки записи (для уникальных имен пользователей)?
"Enter Username"
"Enter Email Address"
"Enter Password"
Я очень смущен о том, как, как запрос к базе данных, чтобы проверить, если имя пользователя существует или нет без чтения снимка базы данных и без, пытающихся записать имя пользователя в базу данных (потому что это происходит, когда пользователь находится в состоянии auth == null, поэтому пока на странице регистрации до того, как пользователь создал свою учетную запись, я хочу сообщить пользователю, его имя пользователя принято или нет).
Я имею в виду, это чувствует, как это должно быть очень просто, простой запрос к Firebase со строкой и просто получить Firebase вернуться Правда или Ложные, но после нескольких часов прибегая к помощи я не смог найти ничего.
Причина, по которой я не хочу использовать снимок, заключается в том, что я не хочу публиковать все имена моих пользователей и их UID, установив «read» в true (я следовал этому руководству, поэтому мой правила безопасности настраиваются именно так, вместе с моей структурой базы данных Firebase android : make username unique).
Вот мои правила, и они работают в настоящее время (мне не нравится тот факт, что для чтения установлено значение Да, поэтому я задаю вопрос, хотя):
{
"rules": {
"usernames": {
".read": true,
"$username": {
".write": "auth !== null && !data.exists()"
}
},
"users": {
"$uid": {
".write": "auth !== null && auth.uid === $uid && !data.exists()",
".read": "auth !== null && auth.provider === 'password' && auth.uid === $uid",
"username": {
".validate": "(!root.child('users').child(newData.val()).exists() || root.child('usernames').child(newData.val()).val() == $uid)"
}
}
}
}
}
И это мои данные:
{
"usernames" : {
"abcd" : "some-user-uid"
},
"users" : {
"\"some-user-uid\"" : {
"username" : "abcd"
}
}
}
Спасибо!
Спасибо за ответ! Какое решение вы предлагаете для максимальной безопасности данных? Я в порядке с моей текущей настройкой (потому что она работает), но read = true немного нервирует, потому что тогда любой может видеть все имена пользователей и их UID, правильно? – Aretyper
Лучшей защитой было бы установить read: true для конкретных записей, но не разрешить чтение родительского пути. Это помешало бы любому просматривать uids; им нужно будет узнать идентификатор пользователя, чтобы просмотреть их. Я не знаю, что вы используете, поэтому я не могу предложить какие-либо конкретные советы. Но вы можете прочитать о проблеме [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem/66378#66378), так как вы можете просить неправильного вопросов. – Kato