Создание и использование анонимного идентификатора для пользователя одновременно с созданием Auth uid Firebase?

Я хотел бы знать, как создать второй (анонимный) идентификатор для пользователя при создании учетной записи.

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

В приложении есть раздел учетной записи в контроллере представления, в котором пользователь получает доступ ко всем данным, связанным с учетной записью. Существует также еще один раздел приложения в том же контроллере представления, где любой пользователь имеет доступ к информации, хранящейся в этой базе данных, позволяет называть ее «Общедоступной базой данных», которую они могут просматривать без создания учетной записи. (Пользователь, который создает учетную запись, не может просматривать общедоступную базу данных, если он не выйдет из своей учетной записи)

Пользователь должен позвонить в базу данных Firebase Realtime, не входя в систему, а затем войти в свою учетную запись позже в тот же день, чтобы узнать, были ли они вознаграждены за поиск правильной ветви в этой общедоступной базе данных.

Например:

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

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

Я разрешаю пользователю создать учетную запись, которая будет вознаграждена за доступ к разделу базы данных, к которому у любого пользователя уже есть доступ.

Я надеюсь, что в этом есть смысл.

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

Я знаю, вы хотите, чтобы я показал какой-то код, независимо от того, имеет ли он отношение к ответу, который я ищу, или нет ...

      func createNewUser()
{
   guard let email = registerEmailField.text, let password = registerPasswordField.text, let name = registerNameField.text
        else
    {
        return
    }

   if self.registerEmailField.text!.isValidEmail == true
    {
        Auth.auth().createUser(withEmail: email, password: password)
        {
            authResult, error in
            if error != nil
            {
                self.newUserError()
                return
            }
            else
            {
            guard let uid = authResult?.user.uid
            else
            {
                return
            }
            let user = ["Name": name,
                        "email": email,
                        "password": password]
              
            let gold = self.goldLabel.text ?? "\(0)"
            let rewards = self.rewardLabel.text ?? "\(0)"

            let savingUserScores = ["gold": gold as Any,
                                    "rewards": rewards as Any]

        Database.database().reference().child("Users").child(uid).updateChildValues(user, withCompletionBlock:
        {
            (error, ref) in
            if let error = error
            {
                print("Failed to update database values with error: ", error.localizedDescription)
                return
            }
        Database.database().reference().child("Users").child(uid).child("scores").updateChildValues(savingUserScores, withCompletionBlock:
        {
            (error, ref) in
            if let error = error
            {
                print("Failed to update database values with error: ", error.localizedDescription)
                return
            }
            else
            {
                self.sendEmailVerification()
                self.hideRegisterWindow()
                self.hideLoginKeyboard()
            DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute:
                    {
                        self.userView.isHidden = true
                        self.checkEmailButton.isHidden = false
                    })
            }
          })
        })
       }
     }
   }
  }
}


func logInUser()
{
  guard let email = logInEmailField.text, let password = logInPasswordField.text
    else
    {
        return
    }
    Auth.auth().signIn(withEmail: email, password: password)
    {
        [weak self] user, error in
        if error != nil
        {
           print("I can't put all this code in here")
        }
        else
        {
          guard let user = Auth.auth().currentUser
                else
            {
                return
            }
            if user.isEmailVerified
            {
              print("I can't put all of the code in here either")
            }
        }
    }
}


func displayUserScoresFromFirebase()
{
    guard let userID = Auth.auth().currentUser?.uid
    else
    {
        return
    }
    Database.database().reference().child("Users").child(userID).child("Name").observe(.value)
    {
        (snapshot)
        in
        guard let name = snapshot.value as? String else
        {
            return
        }
        self.accountNameLabel.text = "HI\n" + "\(name)"
    }
    Database.database().reference().child("Users").child(userID).child("scores").child("gold").observe(.value)
    {
        (snapshot)
        in
        guard let gold = snapshot.value
        else
        {
            return
        }
        let Gold = "\(gold)"
        self.goldLabel.text = Gold//"GOLD TOKENS\n\n" + Gold
    }
    Database.database().reference().child("Users").child(userID).child("scores").child("rewards").observe(.value)
    {
        (snapshot)
        in
        guard let rewards = snapshot.value
        else
        {
            return
        }
        let Rewards = "\(rewards)"
        self.rewardLabel.text = Rewards//"REWARD POINTS\n\n" + Rewards
    }
}


func loadPublicInfoFromDatabase()
{ 
    let ref = Database.database().reference(withPath: "*publicUserInfo")
    
    ref.child("publicInfo").child("publicInfo1").observe(.value)
    {
        (snapshot)
        in
        guard let publicInfo1 = snapshot.value
            else
        {
            return
        }
            self.publicInfoLabel.text = "\(publicInfo1)"
            
        ref.child("publicInfo").child("publicInfo2").observe(.value)
        {
            (snapshot)
            in
            guard let publicInfo2 = snapshot.value
                else
            {
                return
            }
                self.publicInfoLabel.text = "\(publicInfo2)"
        }
    }
}

Еще немного, чтобы усложнить ситуацию. Основная причина всего этого заключается в том, что мне нужно вознаграждать пользователя (у которого есть учетная запись) только в том случае, если он просматривает publicInfo2, но не publicInfo1.

Прошу прощения за то, как структурирован мой код✌️

1 ответ

Чтобы справиться с этим, гостевую учетную запись, которую они используют, необходимо будет обновить, связав ее с проверенным поставщиком аутентификации, выполнив следующие шаги:

  1. Когда пользователь регистрируется, завершите процесс входа в систему для поставщика аутентификации пользователя до, но не включая, вызова одного из методов FIRAuth.signInWith . Например, получите токен Google ID пользователя, токен доступа Facebook или адрес электронной почты и пароль.
  2. Получите FIRAuthCredential для нового поставщика аутентификации
      let credential = EmailAuthProvider.credential(withEmail: email, password: password)
  1. Передайте объект FIRAuthCredential входящему в систему пользователю linkWithCredential: Завершение: метод:
         user.link(with: credential) { (authResult, error) in
  // ...
}

Источник: iOS Auth Convert Guest