使用 Firebase Auth 注销后无法登录

问题描述 投票:0回答:1

如果我在 Firestore Auth 控制台中创建一个用户,然后通过应用程序登录,那就没问题了。但是,如果我通过我的应用程序创建用户,注销,然后尝试登录 - 它会抛出以下错误,并且我没有登录。

如有任何帮助,我们将不胜感激,谢谢。我对 Firebase 不太熟悉。我一直在关注this教程。

错误:

Error Domain=FIRAuthErrorDomain Code=17004“提供的身份验证凭据格式错误或已过期。” UserInfo={NSLocalizedDescription=提供的身份验证凭据格式错误或已过期。, FIRAuthErrorUserInfoNameKey=ERROR_INVALID_CREDENTIAL}

import SwiftUI
import Firebase
import Resolver

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil
    ) -> Bool {
        FirebaseApp.configure()
        return true
    }
}

@main
struct quizApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate

    var body: some Scene {
        WindowGroup {
            SetupView()
        }
    }
}

内容视图

import Resolver
import SwiftUI

extension Resolver: ResolverRegistering {
    public static func registerAllServices() {
        let model = AuthViewModel()

        register {
            model
        }
    }
}

struct ContentView: View {
    @InjectedObject var authViewModel: AuthViewModel

    var body: some View {
        if authViewModel.userSession != nil {
            AppTabView()
        } else {
            LoginView()
        }
    }
}

注册查看

import Resolver
import SwiftUI

struct RegisterView: View {
    @InjectedObject var viewModel: AuthViewModel
    @State var name: String = ""
    @State var email: String = ""
    @State var password: String = ""

    var body: some View {
        List {
            TextField("Name", text: $name)
            TextField("Email", text: $email)
                .textInputAutocapitalization(.never)
                .keyboardType(.emailAddress)
                .textCase(.lowercase)
            SecureField("Password", text: $password)
            Spacer()
            Button("Sign Up") {
                Task {
                    try await viewModel.register(name: name, email: email, password: email)
                }
            }
        }
        .navigationTitle("Register")
    }
}

登录查看

import Resolver
import SwiftUI

struct LoginView: View {
    @InjectedObject var viewModel: AuthViewModel
    @State var email: String = ""
    @State var password: String = ""

    var body: some View {
        NavigationStack {
            List {
                TextField("Email", text: $email)
                    .textInputAutocapitalization(.never)
                    .keyboardType(.emailAddress)
                    .textCase(.lowercase)
                SecureField("Password", text: $password)
                Spacer()
                Button("Login") {
                    Task {
                        try await viewModel.login(email: email, password: password)
                    }
                }
                NavigationLink("Sign up") {
                    RegisterView()
                }
            }
            .navigationTitle("Login")
        }
    }
}

AuthViewModel

import SwiftUI
import FirebaseAuth
import FirebaseFirestoreSwift
import FirebaseFirestore

final class AuthViewModel: ObservableObject {
    @Published var userSession: FirebaseAuth.User?
    @Published var currentUser: User?

    init() {
        // Read from Firestore cache on device if logged in
        self.userSession = Auth.auth().currentUser
    }

    func login(email: String, password: String) async throws {
        do {
            let result = try await Auth.auth().signIn(withEmail: email, password: password)
            self.userSession = result.user
            try await fetch()
        } catch {
            print(error)
        }
    }

    func register(name: String, email: String, password: String) async throws {
        do {
            let result = try await Auth.auth().createUser(withEmail: email, password: password)
            self.userSession = result.user

            //
            let user = User(id: result.user.uid, name: name, jlptLevel: 5, email: email)
            let encodeUser = try Firestore.Encoder().encode(user)
            try await Firestore.firestore().collection("users").document(user.id).setData(encodeUser)

            //
            try await fetch()
        } catch {
            print("Failed to create user", error)
        }
    }

    func signout() {
        do {
            try Auth.auth().signOut()
            self.userSession = nil
            self.currentUser = nil
        } catch {
            print(error)
        }
    }

    func deleteAccount() {
        if let session = self.userSession {
            session.delete()
            self.userSession = nil
            self.currentUser = nil
        }
    }

    func fetch() async throws {
        guard let uid = Auth.auth().currentUser?.uid else { return }
        let snapshot = try await Firestore.firestore().collection("users").document(uid).getDocument()
        self.currentUser = try snapshot.data(as: User.self)
    }
}
ios swift firebase-authentication
1个回答
0
投票

您收到此消息是因为 Google Cloud 的暴力攻击(电子邮件枚举)保护政策。这可能是启用或禁用电子邮件枚举保护的副作用。

概述

电子邮件枚举是一种暴力攻击,其中恶意 参与者尝试通过传递一个值来猜测或确认系统中的用户 API 的电子邮件地址并检查响应。

如果没有电子邮件枚举保护,Identity Platform 将返回 可用于电子邮件枚举攻击的信息:

  • 尝试使用系统中不存在的电子邮件地址登录。 Identity Platform 返回 EMAIL_NOT_FOUND 错误。
  • 尝试使用系统中已存在的电子邮件地址进行注册。 Identity Platform 返回 EMAIL_EXISTS 错误。

您可以使用 Identity Platform 的电子邮件枚举保护 功能可以保护应用程序中的用户帐户免受这些攻击。

重要提示:我们建议您在所有项目上启用电子邮件枚举保护。

如果您在 2023 年 9 月 15 日或之后创建项目,则默认启用电子邮件枚举保护!

所以,我认为用户存在于数据库中。如果不是你的情况,事实上,这就是我的情况。

我希望这对其他人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.