【问题标题】:Creating and using anonymous ID for user at the same time as creating an Auth uid Firebase?在创建 Auth uid Firebase 的同时为用户创建和使用匿名 ID?
【发布时间】:2021-08-04 07:43:42
【问题描述】:

我想知道如何在用户创建帐户时为其创建第二个(匿名)标识符。

这样做的原因是我让用户创建一个帐户以便他们获得奖励,但我需要知道他们是否应该在再次登录他们的帐户之前获得奖励。

在视图控制器中有一个应用程序的帐户部分,用户可以访问所有与帐户相关的数据。在同一个视图控制器中还有应用程序的另一部分,任何用户都可以访问存储在该数据库中的信息,我们将其称为“公共数据库”,他们无需创建帐户即可查看。 (创建帐户的用户必须退出帐户才能查看公共数据库)

用户需要在未登录的情况下调用 Firebase 实时数据库,然后在当天晚些时候登录他们的帐户,看看他们是否因在该公共数据库中搜索正确的分支而获得奖励。

例如:

假设用户使用电子邮件和密码创建帐户。他们从 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 的用户(谁有帐户)。

请原谅我的代码结构✌️

【问题讨论】:

    标签: ios swift firebase-realtime-database firebase-authentication anonymousidentification


    【解决方案1】:

    要处理此问题,他们正在使用的访客帐户需要通过完成以下步骤将其链接到经过验证的身份验证提供程序来升级:

    1. 当用户注册时,完成用户身份验证提供程序的登录流程,直到调用FIRAuth.signInWith 方法之一,但不包括在内。例如,获取用户的 Google ID 令牌、Facebook 访问令牌或电子邮件地址和密码。
    2. 为新的身份验证提供程序获取 FIRAuthCredential
    let credential = EmailAuthProvider.credential(withEmail: email, password: password)
    
    1. 将 FIRAuthCredential 对象传递给登录用户的 linkWithCredential:completion: 方法:
       user.link(with: credential) { (authResult, error) in
      // ...
    }
    

    来源:iOS Auth Convert Guest

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      相关资源
      最近更新 更多