【问题标题】:Check if the user exists in Firebase (phone auth)检查用户是否存在于 Firebase 中(电话身份验证)
【发布时间】:2022-01-11 20:21:35
【问题描述】:

我正在编写一个关于 SwiftUI 和 Firebase 的应用程序。目前,我已经通过电话号码实现了身份验证。当用户输入电话号码时,我会在 Firebase 中获取电话号码和 id 数据。但我也想从用户那里得到一张照片和一个名字。我可以在一个单独的窗口中实现它。问题是,如果用户退出应用程序并再次登录,应用程序会再次要求他上传照片并写下姓名。尽管有关此用户的数据已经在 Firebase 中。有没有办法在发送消息后检查用户是否已注册以显示或不显示带有照片和姓名请求的附加视图?

我的发送代码功能:

func sendCode() {
    
    self.isLoading.toggle()
    
    PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationId, error) in
        
        self.isLoading.toggle()
        
        if error != nil {
            self.isError.toggle()
            self.errorMsg = error?.localizedDescription ?? ""
            return
        }
        
        UserDefaults.standard.set(verificationId, forKey: "verificationId")
        self.isVerify.toggle()
    }
}

我的验证功能:

func verifyCode(code: String, name: String, num: String) {
    self.isLoadingVerify.toggle()
    
    let verificationId = UserDefaults.standard.string(forKey: "verificationId") ?? ""
    let credentials = PhoneAuthProvider.provider().credential(withVerificationID: verificationId, verificationCode: code)
    
    Auth.auth().signIn(with: credentials) { (authResult, error) in
       
        self.isLoadingVerify.toggle()
        self.userSession = authResult?.user
        self.fetchUser()
        
        if error != nil {
            self.isError.toggle()
            self.errorMsg = error?.localizedDescription ?? ""
            return
        }
        guard let user = authResult?.user else { return }
        self.tempCurrentUser = user
        
//        self.userSession = user
        
        let data = ["name": name.lowercased(),
                     "uid": user.uid,
                     "num": num
        ]
        COLLECTION_USERS.document(user.uid).setData(data) { _ in
              self.fetchUser()
//            self.userSession = user
//            self.fetchUser()убрал после того как не загрузилось фото профиля
        }

        print(authResult ?? "")
        self.isVerify.toggle()
        self.isVerified.toggle()
        self.isPhotoName.toggle()
    }
    
}

【问题讨论】:

    标签: google-cloud-firestore swiftui firebase-authentication


    【解决方案1】:

    在调用登录之前,您可以检查是否有已经登录的用户。 检查:

    Auth.auth().currentUser != nil
    

    而且您可以避免再次登录。如果用户存在,您可以从中获取用户 ID

    Auth.auth().currentUser?.uid
    

    【讨论】:

    • 好的,谢谢您的回答。我想澄清更多,我刚开始学习编程,我需要一些澄清。我应该在代码的哪一部分插入 Auth.auth().CurrentUser != null ?据我了解,此调用检查此用户是否在 Firebase 中。但是当我用手机号登录的时候,我还是要给他发信息,然后用验证码验证。我应该将此代码插入验证功能吗?我的意思是,我如何在实践中使用此调用,例如,在用户输入验证码后显示或不显示附加视图?谢谢
    • 例如,我询问 CurrentUser == nil,但只有在用户从短信中输入确认码之前,它才等于 nil。毕竟,用户输入代码后,它不会立即为 nil。然后即使是第一次登录,它也会立即变为 not nil。 @Seamus
    • firebase SDK 将登录的用户保存到磁盘。这意味着在您登录后,即使您在再次打开应用程序时完全重新启动应用程序,您仍然处于登录状态,并且不需要再次验证号码,除非您在某处拨打Auth.auth().signOut()。想想像 facebook 这样的其他应用程序是如何工作的,你不会每次都登录。在您调用 verifyCode(... 之前,我会将登录检查放入您的代码中,例如:if isLoggedIn() == false { verifyCode() } else { // go to home screen)
    • 所以,我的用户进来了,创建了个人资料,上传了照片,仅此而已。然后他拿起另一部手机想登录他的帐户,输入你的号码,然后程序再次要求他写名字并上传照片,但他已经这样做了。这正是我想避免的。 @Seamus
    • 是的,在不同的设备上,这是不同的场景。如果您再次验证该号码,您将从 firebase 获得相同的 userId。并且您可以使用此 id 来获取您之前保存的用户信息。可能您在 Firestore 数据库的集合中保存了一些用户详细信息?如果是这样,您需要在登录后再次获取此信息。
    猜你喜欢
    • 2019-02-22
    • 2018-11-09
    • 2022-06-30
    • 2018-07-08
    • 2019-03-11
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    相关资源
    最近更新 更多