Apresentando o Login com a Apple no seu aplicativo iOS

Na WWDC 2019, a Apple mais uma vez perturbou a paz dos desenvolvedores do iOS - introduziu um novo sistema de autorização de usuário. Entre na Apple. Agora, todos os aplicativos iOS que usam sistemas de autorização de terceiros (Facebook, Twitter etc.) devem implementar o Login com a Apple sem falhas, caso contrário, eles serão expulsos da AppStore. Decidimos não tentar o destino e corremos para implementar esse recurso. Como exatamente fizemos isso - descubra abaixo.

Escrevemos serviço de autorização através da Apple


Em nosso trabalho, usamos a arquitetura VIPER + SOA, e autorizamos a Apple como um serviço separado. Primeiro, agrupamos os dados em enum para expandir convenientemente os tipos de autorização (Facebook, VK, Google etc.):

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

Nós passaremos o resultado usando o Observable from RxSwift :

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

Implementação de protocolo:

 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 para conhecer


  1. O login com a Apple não tem uma função de logout no sentido clássico da palavra. A biblioteca não armazena nenhum dado, diferentemente de outras bibliotecas de entrada, portanto, não há necessidade de apagar os dados recebidos pelo login.
  2. O login com a Apple recebe o nome e o sobrenome do usuário apenas uma vez no primeiro login. O servidor não tem acesso a esses dados. Nas tentativas de logon subseqüentes, você receberá apenas o notificationCode de ASAuthorizationAppleIDCredential . Portanto, no lado do cliente, armazenamos o nome e o sobrenome do usuário até que o registro no servidor seja bem-sucedido.
  3. Entrar com a Apple permite que o usuário substitua seu e-mail. Você pode gravar em um email falsificado apenas daqueles domínios que você especificar nas configurações em developer.apple.com

  4. Este artigo descreve como implementamos a parte de back-end.

O artigo acabou sendo pequeno, mas esperamos que tenha sido útil para você.

Obrigado pela atenção!

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


All Articles