如果我在 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)
}
}
您收到此消息是因为 Google Cloud 的暴力攻击(电子邮件枚举)保护政策。这可能是启用或禁用电子邮件枚举保护的副作用。
概述
电子邮件枚举是一种暴力攻击,其中恶意 参与者尝试通过传递一个值来猜测或确认系统中的用户 API 的电子邮件地址并检查响应。
如果没有电子邮件枚举保护,Identity Platform 将返回 可用于电子邮件枚举攻击的信息:
- 尝试使用系统中不存在的电子邮件地址登录。 Identity Platform 返回 EMAIL_NOT_FOUND 错误。
- 尝试使用系统中已存在的电子邮件地址进行注册。 Identity Platform 返回 EMAIL_EXISTS 错误。
您可以使用 Identity Platform 的电子邮件枚举保护 功能可以保护应用程序中的用户帐户免受这些攻击。
重要提示:我们建议您在所有项目上启用电子邮件枚举保护。
所以,我认为用户存在于数据库中。如果不是你的情况,事实上,这就是我的情况。
我希望这对其他人有帮助。