在创建 Auth uid Firebase 的同时为用户创建和使用匿名 ID?

如何解决在创建 Auth uid Firebase 的同时为用户创建和使用匿名 ID?

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

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

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

用户需要在未登录的情况下调用 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,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. 当用户注册时,完成用户身份验证提供程序的登录流程,最多(但不包括)调用 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?