Présentation de la connexion avec Apple dans votre application iOS

Lors de la WWDC 2019, Apple a une fois de plus troublé la paix des développeurs iOS en introduisant un nouveau système de connexion avec l'autorisation d'utilisateur Apple. Désormais, toutes les applications iOS qui utilisent des systèmes d'autorisation tiers (Facebook, Twitter, etc.) doivent nécessairement implémenter la connexion avec Apple, sinon elles seront expulsées de l'AppStore. Nous avons décidé de ne pas tenter le destin et avons couru pour implémenter cette fonctionnalité. Comment exactement nous avons fait cela - découvrez sous la coupe.

Nous écrivons le service d'autorisation via Apple


Dans notre travail, nous utilisons l'architecture VIPER + SOA, nous avons donc fait une autorisation via Apple en tant que service distinct. Premièrement, nous encapsulons les données en enum afin d'élargir commodément les types d'autorisation (Facebook, VK, Google, etc.):

enum AuthToken { case apple(code: String, name: String) } 

Nous passerons le résultat en utilisant l'Observable de RxSwift :

 protocol AuthProviderProtocol { var authResult: Observable<AuthToken> { get } func login() func logout() } 

Mise en œuvre du protocole:

 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)) } } 

Nuances à connaître


  1. Se connecter avec Apple n'a pas de fonction de déconnexion au sens classique du terme. La bibliothèque ne stocke aucune donnée, contrairement aux autres bibliothèques d'entrée, il n'est donc pas nécessaire d'effacer les données reçues par connexion.
  2. Connectez-vous avec Apple ne reçoit le prénom et le nom de l'utilisateur qu'une seule fois lors de la toute première connexion. Le serveur n'a pas accès à ces données. Lors des tentatives de connexion suivantes, vous ne recevrez que le code d' autorisation de ASAuthorizationAppleIDCredential . Par conséquent, côté client, nous stockons le nom et le prénom de l'utilisateur jusqu'à ce que l'enregistrement sur le serveur soit réussi.
  3. Se connecter avec Apple permet à l'utilisateur de remplacer son e-mail. Vous pouvez écrire sur un e-mail usurpé uniquement à partir des domaines que vous spécifiez dans les paramètres de developer.apple.com

  4. Cet article décrit comment nous avons implémenté la partie back-end.

L'article s'est avéré petit, mais nous espérons qu'il vous a été utile.

Merci de votre attention!

Source: https://habr.com/ru/post/fr467231/


All Articles