Di WWDC 2019, Apple sekali lagi mengganggu ketenangan pengembang iOS - memperkenalkan sistem otorisasi pengguna baru. Masuk dengan Apple. Sekarang semua aplikasi iOS yang menggunakan sistem otorisasi pihak ketiga (Facebook, Twitter, dll.) Harus menerapkan Masuk dengan Apple tanpa gagal, jika tidak mereka akan mengeluarkannya dari AppStore. Kami memutuskan untuk tidak menggoda nasib dan berlari untuk mengimplementasikan fitur ini. Bagaimana tepatnya kami melakukan ini - cari tahu di bawah potongan.
Kami menulis layanan otorisasi melalui Apple
Dalam pekerjaan kami, kami menggunakan arsitektur VIPER + SOA, jadi kami membuat otorisasi melalui Apple sebagai layanan terpisah. Pertama, kami membungkus data dalam enum agar mudah memperluas jenis otorisasi (Facebook, VK, Google, dll.):
enum AuthToken { case apple(code: String, name: String) }
Kami akan membagikan hasilnya menggunakan Observable dari
RxSwift :
protocol AuthProviderProtocol { var authResult: Observable<AuthToken> { get } func login() func logout() }
Implementasi protokol:
import AuthenticationServices import Foundation import RxSwift @available(iOS 13.0, *) class AppleAuthService: AuthProviderProtocol { private let authResultSubject = PublishSubject<AuthToken>() var authResult: Observable<AuthToken> { return authResultSubject.asObservable() } func login() { let appleIDProvider = ASAuthorizationAppleIDProvider() let request = appleIDProvider.createRequest() request.requestedScopes = [.fullName, .email] let authorizationController = ASAuthorizationController(authorizationRequests: [request]) authorizationController.delegate = self authorizationController.performRequests() } } @available(iOS 13.0, *) extension AppleAuthService: ASAuthorizationControllerDelegate { func authorizationController( controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization ) { guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential, let tokenData = credential.authorizationCode, let token = String(data: tokenData, encoding: .utf8) else { return } let firstName = credential.fullName?.givenName let lastName = credential.fullName?.familyName authResultSubject.onNext(.apple(code: token, name: firstName + lastName)) } }
Nuansa yang perlu diketahui
- Masuk dengan Apple tidak memiliki fungsi logout dalam arti kata klasik. Pustaka tidak menyimpan data apa pun, tidak seperti pustaka masukan lainnya, jadi tidak perlu menghapus data yang diterima saat login.
- Masuk dengan Apple menerima nama depan dan belakang pengguna hanya sekali pada saat login pertama. Server tidak memiliki akses ke data ini. Pada upaya masuk berikutnya, Anda hanya akan menerima Kode otorisasi dari ASAuthorizationAppleIDCredential . Oleh karena itu, di sisi klien, kami menyimpan nama dan nama pengguna hingga pendaftaran di server berhasil.
- Masuk dengan Apple memungkinkan pengguna untuk mengganti email mereka. Anda dapat menulis ke email palsu hanya dari domain yang Anda tentukan dalam pengaturan di developer.apple.com

- Artikel ini menjelaskan bagaimana kami menerapkan bagian back-end.
Artikel ini ternyata kecil, tetapi kami berharap artikel ini bermanfaat bagi Anda.
Terima kasih atas perhatian anda!