Nano Hash - криптовалюты, майнинг, программирование

Проверка наличия данных в Firebase перед созданием пользователя

У меня есть небольшая форма входа в систему, где новый пользователь должен добавить свое имя пользователя, пароль и псевдоним (поскольку базовая аутентификация firebase принимает только электронную почту в качестве имени пользователя, верно?).

Это структура пользователей, которую я создал в Firebase для получения псевдонима  введите описание изображения здесь

Ключ основан на имени пользователя и имеет 2 дочерних элемента: псевдоним и имя пользователя.

Прежде чем я попытаюсь создать пользователя с помощью методов аутентификации из Firebase, я запрашиваю, чтобы проверить, существует ли уже псевдоним. Если да, он не создает пользователя и выдает предупреждение. Если псевдоним не существует, он создает пользователя, а затем добавляет псевдоним в структуру пользователей из изображения выше.

Некоторое время обдумывая и меняя код здесь и там (код перескакивал через «ObservationSingleEventOfType» и выполнял createUser, прежде чем проверять, существует ли уже псевдоним), я подумал, что хорошей идеей было получить код createUser и добавить его прямо внутри НаблюдатьSingleEventOfType в запросе псевдонима как 'else' для 'if snapshot.exists ()' ...

Кажется, он работает, но я не знаю, является ли это «правильным» способом его выполнения ...

Есть ли другой способ (лучший способ) сделать это?

Метод ниже. Спасибо!

 func createUser(username: String, password: String, nickname: String){

    var userCreated = false
    var errorCode = 0

    users.queryOrderedByChild("Nickname").queryEqualToValue(nickname).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
        if snapshot.exists() {
            errorCode = 3
            self.delegate?.didReceiveResponseFromFirebaseCreateUser!(userCreated, errorCode: errorCode)
        }
        else{
            self.ref.createUser(username, password: password, withCompletionBlock: { (error) in
                if error != nil {
                    print (error.description)

                    if error.description.rangeOfString("EMAIL_TAKEN") != nil {
                        errorCode = 1
                    }
                    else if error.description.rangeOfString("INVALID_EMAIL") != nil {
                        errorCode = 2
                    }

                }
                else{
                    userCreated = true
                    let newUser = User(username: username, nickname: nickname)

                    let newUserRef = self.users.childByAppendingPath(username.stringByReplacingOccurrencesOfString(".", withString: "-"))
                    newUserRef.setValue(newUser.toAnyObject())

                }

                self.delegate?.didReceiveResponseFromFirebaseCreateUser!(userCreated, errorCode: errorCode)

            })
        }


    })
}

  • Больше не требуется для этого вопроса, но в целом: имейте в виду, что изображение дерева JSON в вашем вопросе не так полезно, как JSON в виде текста, который вы можете легко получить, нажав кнопку «Экспорт» в своей базе данных Firebase. . Наличие JSON в виде текста делает его доступным для поиска, позволяет нам легко использовать его для тестирования с вашими фактическими данными и использовать его в нашем ответе, и в целом это просто Хорошее дело. 17.04.2016

Ответы:


1

Я столкнулся с той же проблемой, когда создавал свое последнее приложение Firebase. Метод, который я использовал для решения этой проблемы, заключался в создании дополнительного сопоставления имени пользователя с идентификаторами пользователей. Итак, моя структура выглядит примерно так (uid - это идентификатор пользователя из Firebase auth):

users: {
   accounts: {
      uid1: { 
          username: frank,
          ...
      },
      uid2: { 
          username: monique,
          ...
      }
      ...
   },
   username_to_uid: {
      frank: uid1,
      monique: uid2,
      ...
   }
}

Это позволяет сделать две важные вещи:

  1. Пока пользователь пытается зарегистрироваться, вы можете сначала проверить, существует ли уже предоставленное им имя пользователя, используя сопоставление "username_to_uid".
  2. Вы также можете входить в систему пользователей, используя их логины и пароль. По умолчанию вы можете войти в систему, используя аутентификацию Firebase, с адресом электронной почты и паролем. Здесь идея состоит в том, что для данного имени пользователя вы можете легко получить uid, связанный с этим именем пользователя, используя сопоставление «username_to_uid», чтобы вы могли входить в систему пользователей с именами пользователей и паролем.
14.04.2016
  • Ух ты! Это отличная идея! Попробую здесь. Я обязательно попробую. Спасибо! 15.04.2016
  • @LucasAlmeida Приятно это слышать! 15.04.2016
  • Это, безусловно, пригодится, чтобы улучшить процесс аутентификации (используя псевдоним вместо электронной почты), но для проблемы с firebase-swift мне нужно будет выяснить, сохраню ли я его текущим способом или нет ... НаблюдениеSingleEventOfType ведет себя асинхронно, до того, как его блок будет выполнен, он выполнял createUser, а переменная, возвращающая истину для существующего никнейма, отправлялась как ложь, поэтому создавалось несколько пользователей с одним и тем же ником. Вот почему я «зажал» код createUser внутри блока наблюденияSingleEventOfType ... 15.04.2016
  • Я буду искать другие варианты (хотя они работают) ... Но я обязательно воспользуюсь вашей идеей для своего метода входа в систему! Еще раз спасибо! 15.04.2016
  • Отличное решение @pkacprzak. Не забудьте защитить данные с помощью правила безопасности, чтобы никто не мог перезаписать чужой ник (и только владелец uid мог его удалить). 15.04.2016
  • @FrankvanPuffelen действительно. На данный момент мы не занимаемся удалением, но здесь очень важно наличие правила безопасности для доступа на запись. На самом деле, мы используем Firebase-Bold для написания наших правил безопасности, и там мы можем использовать очень удобное правило создания, которое идеально подходит в этом случае. 17.04.2016

  • 2

    Просто напомню о проблеме синхронности, которая возникла у меня с Firebase Event Observer:

    Вчера я думал, что он работает, у меня были проблемы при вызове segue для открытия другого viewController (он вызывал новое представление, пока Observer все еще работал без результатов, и приложение разбилось, потому что используемый метод делегата не был объявлен на другой взгляд) ...

    В качестве решения я избавился от всех делегатов и перекодировал методы с помощью обработчиков завершения ... Теперь все идет отлично!

    Да, и @pkacprzak: я внес изменения и начал использовать эту «мостовую структуру» для хранения связи между ником и uid. Человек, теперь его пинают! Спасибо вам большое за это!

    15.04.2016
  • Потрясающие! Говоря об обработчиках завершения, есть такая отличная концепция в цепочке асинхронных задач, если кто-то знает их силу :) и здорово, что вы их используете 15.04.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..