代码之家  ›  专栏  ›  技术社区  ›  Tulon

Firebase身份验证SwiftUI:更改密码后,电子邮件验证状态变为真

  •  0
  • Tulon  · 技术社区  · 11 月前

    我在iOS应用程序中使用Firebase身份验证,并在用户注册期间实施了电子邮件验证。我还会在登录时检查未经验证的电子邮件,并要求用户在访问应用程序之前验证他们的电子邮件,该应用程序正在按预期工作。然而,我注意到了一个意想不到的行为:

    1. 用户使用电子邮件和密码注册,但不验证他们的电子邮件。
    2. 由于电子邮件验证检查,用户不允许进入应用程序。
    3. 用户在不验证电子邮件的情况下重置密码。
    4. 更改密码后,用户可以访问应用程序,因为isEmailVerified变为true。

    我早料到 isEmailVerified 在密码更改后保持为false,因为电子邮件验证和密码更改是单独的过程。用户在访问应用程序之前仍需要验证他们的电子邮件。 这种行为在Firebase身份验证中是预期的吗?

    代码:

    @MainActor
        func signInWithEmail() async {
            isLoading = true
            
            validateEmail()
            validatePassword()
            
            if emailCredentials.email.isEmpty {
                emailValidationState.email = .invalid("Email is required")
                isLoading = false
                return
            }
            if emailCredentials.password.isEmpty {
                emailValidationState.password = .invalid("Password is required")
                isLoading = false
                return
            }
            
            guard case .valid = emailValidationState.email,
                  case .valid = emailValidationState.password else {
                isLoading = false
                return
            }
            
            do {
                let result = try await authService.signInWithEmail(
                    email: emailCredentials.email,
                    password: emailCredentials.password
                )
                print("BBBB \(result.user.isEmailVerified)")
                if !result.user.isEmailVerified {
                    emailVerificationState.credentials = AuthenticationModel.CreateAccountCredentials(
                        email: emailCredentials.email,
                        password: emailCredentials.password
                    )
                    emailVerificationState.email = emailCredentials.email
                    try await result.user.sendEmailVerification()
                    emailAuthAlert.message = AppConstants.Alert.Message.format(
                        AppConstants.Alert.Message.emailVerificationSent,
                        with: emailCredentials.email
                    )
                    emailAuthAlert.showAlert = true
                    
                } else {
                    handleSuccessfulAuthentication(for: .email)
                }
                
            } catch {
                handleAuthError(error, for: .emailAuth)
            }
            
            isLoading = false
        }
    
    @MainActor
    func resetPassword() async {
        isLoading = true
        
        validateResetPasswordEmail()
        
        if resetPasswordCredentials.email.isEmpty {
            resetPasswordValidationState.email = .invalid("Email is required")
            isLoading = false
            return
        }
        
        guard case .valid = resetPasswordValidationState.email else {
            isLoading = false
            return
        }
        
        do {
            try await authService.resetPassword(email: resetPasswordCredentials.email)
            forgotPasswordAlert.message = AppConstants.Alert.Message.format(
                AppConstants.Alert.Message.passwordResetSent,
                with: resetPasswordCredentials.email
            )
            
            forgotPasswordAlert.showAlert = true
        } catch {
            handleAuthError(error, for: .forgotPassword)
        }
        
        isLoading = false
    }
    
    1 回复  |  直到 11 月前
        1
  •  1
  •   Frank van Puffelen    11 月前

    这个 emailVerified Firebase身份验证中的标志表示是否已验证用户拥有该电子邮件地址;没有更多,也没有更少。鉴于此,他们点击密码重置电子邮件中的链接会验证他们是否可以访问该电子邮件地址,因此构成电子邮件验证。

    所以,对于你的问题:是的,预计 电子邮件已验证 在用户通过电子邮件链接重置密码后设置为true。


    你遇到的问题来自于你试图为你的作品添加自己的意义 电子邮件已验证 属性,特别是您是否在Firestore中为该用户创建了文档。

    为了防止这种不匹配,我建议 使用 电子邮件已验证 为了这个目的。相反,每当您需要从Firestore加载用户的配置文件文档时,首先检查是否存在这样的文档,如果不存在:通过创建文档的注册流程发送它们。

    推荐文章