如何解决在创建 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。
请原谅我的代码结构方式✌️
解决方法
要处理此问题,他们使用的访客帐户需要通过完成以下步骤将其链接到经过验证的身份验证提供商来升级:
- 当用户注册时,完成用户身份验证提供程序的登录流程,最多(但不包括)调用 FIRAuth.signInWith 方法之一。例如,获取用户的 Google ID 令牌、Facebook 访问令牌或电子邮件地址和密码。
- 为新的身份验证提供程序获取 FIRAuthCredential
let credential = EmailAuthProvider.credential(withEmail: email,password: password)
- 将 FIRAuthCredential 对象传递给登录用户的 linkWithCredential:completion: 方法:
user.link(with: credential) { (authResult,error) in
// ...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。