- Published on
Firebase authentication: parolni tiklash va emailni o'zgartirish (2-qism)
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Darsning maqsadi
Oldingi videoda biz xuddi bitta "Sign In" tugmasi orqali yangi foydalanuvchini yaratgan edik. Ammo u darsda ko'rdikki, agar mavjud email orqali yana ro'yxatdan o'tmoqchi bo'lsak, Firebase xatolik beradi. Endi bu muammoni hal qilamiz va unga qo'shimcha ravishda foydalanuvchi akkauntini to'liq boshqarish (parolni yangilash, emailni almashtirish) funksiyalarini qo'shamiz.
"Sign In" (Tizimga kirish) mantiqini takomillashtirish
Real ilovalarda ko'pincha "Sign Up" (Ro'yxatdan o'tish) va "Sign In" (Kirish) tugmalari alohida bo'ladi. Lekin biz o'quv dasturimizda kodni ortiqcha cho'zmaslik uchun bitta tugmaning o'ziga ikkala amalni ham biriktiramiz:
- Dastlab foydalanuvchini ro'yxatdan o'tkazishga harakat qilamiz (
createUser). - Agar u "Foydalanuvchi allaqachon mavjud" degan xatolik qaytarsa, unda uni o'sha profilga kiritishga harakat qilamiz (
signInUser).
AuthenticationManager'ga o'zgartirish
AuthenticationManager klassimizga yangi funksiya qo'shamiz:
// ... boshqa kodlar ...
// Mavjud foydalanuvchini tizimga kiritish
func signInUser(email: String, password: String) async throws -> AuthDataResultModel {
let authDataResult = try await Auth.auth().signIn(withEmail: email, password: password)
return AuthDataResultModel(user: authDataResult.user)
}
Endi SignInEmailViewModel dagi signIn() funksiyasini biroz o'zgartiramiz:
func signIn() async throws {
guard !email.isEmpty, !password.isEmpty else {
print("Email yoki parol topilmadi.")
return
}
do {
// 1-qadam: Ro'yxatdan o'tishga urinib ko'ramiz
let returnedUserData = try await AuthenticationManager.shared.createUser(email: email, password: password)
print("Muvaffaqiyatli ro'yxatdan o'tildi!")
} catch {
// 2-qadam: Agar xatolik bo'lsa (akkaunt mavjud bo'lsa), tizimga kiritamiz
let returnedUserData = try await AuthenticationManager.shared.signInUser(email: email, password: password)
print("Muvaffaqiyatli tizimga kirildi!")
}
}
Ana endi dastur to'g'ri ishlaydi: avval tizimda yo'q bo'lsa ro'yxatga oladi, bor bo'lsa tizimga kiritadi. Muvaffaqiyatli kirgandan so'ng ekranni yopish (dismiss) uchun View'ga @Binding orqali showSignInView = false qilish esdan chiqmasin.
Qo'shimcha funksiyalar
Email va parol bilan ishlashda biz quyidagi 3 ta asosiy funksiyaga ham ehtiyoj sezamiz:
- Parolni tiklash (Reset Password - email orqali)
- Parolni ilova ichidan o'zgartirish (Update Password)
- Emailni o'zgartirish (Update Email)
AuthenticationManager ga yangi metodlar
// 1. Parolni tiklash (email jo'natish)
func resetPassword(email: String) async throws {
try await Auth.auth().sendPasswordReset(withEmail: email)
}
// 2. Parolni o'zgartirish
func updatePassword(password: String) async throws {
guard let user = Auth.auth().currentUser else {
throw URLError(.badServerResponse)
}
try await user.updatePassword(to: password)
}
// 3. Emailni o'zgartirish
func updateEmail(email: String) async throws {
guard let user = Auth.auth().currentUser else {
throw URLError(.badServerResponse)
}
try await user.updateEmail(to: email)
}
Xavfsizlik qoidalari (Recent Authentication)
Aytaylik, kimdir foydalanuvchining telefonini olib, uning parolini o'zgartirib qo'ymoqchi bo'ldi. Bu juda katta xavfsizlik muammosi hisoblanadi. Shu sababli, updatePassword yoki updateEmail kabi nozik ("sensitive") harakatlarni bajarish uchun Firebase foydalanuvchidan yaqinda tizimga kirgan bo'lishini (recently authenticated) talab qiladi.
Agar foydalanuvchi ancha oldin (masalan, bir hafta oldin) login qilgan bo'lsa-yu, parolini hozir o'zgartirmoqchi bo'lsa, konsolda "This operation is sensitive and requires recent authentication" (Bu amal xavfsizlikka ta'sir qiladi va yaqinda o'tilgan avtorizatsiyani talab qiladi) degan xatolik chiqadi. Buni chetlab o'tish uchun foydalanuvchidan o'z parolini qaytadan kiritishni (Re-authenticate) yoki qayta login qilishni so'rashimiz kerak bo'ladi.
Parolni tiklash xati (Reset Password Email)
Agar siz resetPassword funksiyasini chaqirsangiz, Firebase siz ko'rsatgan pochtaga avtomatik ravishda parolni tiklash havolasini yuboradi.
Foydalanuvchiga boradigan xatdagi Ilova nomi (App name) ni o'zgartirish uchun:
- Firebase Konsoliga kiring.
- Yuqori chap burchakdagi vitescha (Settings) belgisiga bosib, Project Settings ga o'ting.
- General bo'limida pastroqqa tushsangiz "Public-facing name" degan maydon bor.
- O'sha yerga o'z ilovangiz nomini (masalan,
SwiftfulFirebaseBootcamp) yozing. Endi foydalanuvchilarga boradigan barcha xatlar xuddi sizning kompaniyangiz nomidan yuborilgan kabi professional ko'rinishda bo'ladi!
Xulosa
Agar e'tibor bergan bo'lsangiz, email va parol orqali avtorizatsiya qilish ancha ko'p kod va ehtiyotkorlik (parolni tiklash, xavfsizlik qoidalari, tasdiqlash xatlari va h.k.) talab qiladi. Biroq Google yoki Apple kabi uchinchi tomon xizmatlari orqali (Third-party authentication) tizimga kirilganda biz bu muammolar haqida bosh qotirmaymiz. Parol yoddan chiqsa, uni to'g'ridan to'g'ri Google'ning o'zi hal qilib beradi. Keyingi videolarda aynan shunday usullar orqali avtorizatsiya qilishni o'rganamiz!