Published on

Firebase authentication: anonim (yashirincha) tizimga kirish

Authors

Nega aynan Anonim (Anonymous) avtorizatsiya?

Ko'pgina ilovalarni kuzatgan bo'lsangiz, ularni yuklab olib ochganingizda, birdaniga sizdan ro'yxatdan o'tishni so'ramaydi. Dasturni ishlatib ko'rishga ruxsat beradi va keyinroq akkaunt ochishni taklif qiladi (try-before-you-buy). Ammo dasturchi sifatida biz foydalanuvchining ma'lumotlarini (masalan, savatchasiga nima solgani yoki sozlamalarini) qayerdadir saqlashimiz kerak bo'ladi. Buning uchun ularga "yashirincha" unikal ID berib, vaqtinchalik akkaunt ochish maqsadga muvofiqdir. Aynan shunday holatlar uchun Firebase Anonymous Authentication (Anonim avtorizatsiya) xizmatini taqdim etadi.

Uning afzalliklari:

  1. Hech qanday login-parol kerak emas.
  2. Bazani xavfsiz himoyalashda (Security Rules) faqatgina ro'yxatdan o'tganlar (Authenticated) kirishi mumkin degan qoidani ishlatishingizga imkon beradi (chunki anonim foydalanuvchilar ham authenticated hisoblanadi).
  3. Eng qizig'i, keyinroq ularning vaqtinchalik hisobiga Google yoki Apple profilini ulab (link) qo'yishingiz mumkin!

1. Firebase Konsolida faollashtirish

  1. Firebase Console -> Authentication bo'limiga kiring.
  2. Add new provider qatoridan Anonymous ni tanlang.
  3. Uni faollashtiring (Enable) va saqlang.

2. Dasturda qo'llash

Anonim kirishni ilovada amalga oshirish nihoyatda oson! Buning uchun AuthenticationManager faylimizga bitta oddiy funksiya yozamiz:

// AuthenticationManager.swift ichida

func signInAnonymously() async throws -> AuthDataResultModel {
    let authDataResult = try await Auth.auth().signInAnonymously()
    return AuthDataResultModel(user: authDataResult.user)
}

View Model'da uni chaqirish:

func signInAnonymous() async throws {
    let returnedUserData = try await AuthenticationManager.shared.signInAnonymously()
    print("Anonim tarzda muvaffaqiyatli kirdik! User ID: \(returnedUserData.uid)")
}

Agar buni ishga tushirsangiz va natijani ko'rsangiz, foydalanuvchi orqa fonda muvaffaqiyatli avtorizatsiyadan o'tgan bo'ladi va Firebase konsolida "Anonymous" provayderi orqali yangi User ID paydo bo'ladi.

Endi, foydalanuvchining anonim yoki haqiqiy profil ekanligini ajratib olishimiz ham kerak:

struct AuthDataResultModel {
    let uid: String
    let email: String?
    let isAnonymous: Bool // <-- shu yerni qo'shamiz

    init(user: User) {
        self.uid = user.uid
        self.email = user.email
        self.isAnonymous = user.isAnonymous
    }
}

3. Akkauntlarni bog'lash (Linking accounts)

Eng muhim narsa: Foydalanuvchi anonim holatda kirdi va dasturni ishlatdi. Keyin o'z Google yoki Apple akkaunti orqali "Sign In" tugmasini bosdi. Agar siz avvalgidek to'g'ridan-to'g'ri signInWithGoogle ni chaqirib yuborsangiz, Firebase yangi mutlaqo boshqa profil yaratib yuboradi! Natijada foydalanuvchining hamma oldingi ma'lumotlari (anonim profilidagi saqlangan narsalari) yo'qoladi.

Bunday holat yuz bermasligi uchun, biz mavjud profilga (joriy anonim akkauntga) yangi credential'ni (Google/Apple) ulashimiz (link) kerak.

Qanday ulanadi?

signIn(with: credential) funksiyasi o'rniga link(with: credential) ishlatiladi. Keling, AuthenticationManagerga yangi metodlarni qo'shamiz:

// 1. Umumiy ulash funksiyasi
private func linkCredential(credential: AuthCredential) async throws -> AuthDataResultModel {
    guard let user = Auth.auth().currentUser else {
        throw URLError(.badURL)
    }

    // signIn emas, link ishlatiladi
    let authDataResult = try await user.link(with: credential)
    return AuthDataResultModel(user: authDataResult.user)
}

// 2. Email orqali ulash
func linkEmailAccount(email: String, password: String) async throws -> AuthDataResultModel {
    let credential = EmailAuthProvider.credential(withEmail: email, password: password)
    return try await linkCredential(credential: credential)
}

// 3. Google orqali ulash
func linkGoogleAccount(tokens: GoogleSignInResultModel) async throws -> AuthDataResultModel {
    let credential = GoogleAuthProvider.credential(withIDToken: tokens.idToken, accessToken: tokens.accessToken)
    return try await linkCredential(credential: credential)
}

// 4. Apple orqali ulash
func linkAppleAccount(tokens: SignInWithAppleResult) async throws -> AuthDataResultModel {
    let credential = OAuthProvider.credential(withProviderID: "apple.com", idToken: tokens.token, rawNonce: tokens.nonce)
    return try await linkCredential(credential: credential)
}

Shu tarzda anonim holatda yozilgan (shuningdek odatiy holdagi barcha akkauntlar ham) profil bir nechta provayderlarga bir vaqtning o'zida ulanib ketilishi mumkin. Ya'ni, yagona akkaunt bir vaqtning o'zida ham Google, ham Apple, ham Email parollarga ega bo'lishi mumkin! Firebase buni ham juda yaxshi tushunadi.

Xulosa

Anonim kirish bizga foydalanuvchini umuman majburlamasdan darhol avtorizatsiya qilib olishga va xavfsiz tizim qoidalarini (Security Rules) o'rnatishga imkon berdi. "Link" mexanizmi orqali esa, kerak bo'lganda o'sha vaqtinchalik akkauntni "haqiqiy" doimiy akkauntlarga ko'chirib o'tishimiz mumkin bo'ldi. Bu juda ham kerakli va tajribali iOS dasturchilar har kuni ishlatadigan pattern hisoblanadi. Keyingi darsda esa biz ushbu yaratgan akkauntlarni qaytadan to'g'ri yo'q qilish (Delete User) va o'chirish logikasini ko'ramiz.

Buy mea coffee