Sobes.tech
Middle+

Como implementar a autenticação através da Apple numa aplicação iOS?

sobes.tech IA

Resposta da IA

Para implementar a autenticação com a Apple (Iniciar sessão com a Apple) numa aplicação iOS, são necessários os seguintes passos:

  1. Configurar a aplicação no Apple Developer Portal:

    • Ativar a capacidade "Iniciar sessão com a Apple" para o seu App ID.
    • Gerar ou atualizar o Perfil de Provisão com a capacidade ativada.
  2. Adicionar a capacidade "Iniciar sessão com a Apple" no projeto Xcode.

  3. Utilizar o framework AuthenticationServices.

Exemplo de código para iniciar a solicitação de autenticação:

import AuthenticationServices

@available(iOS 13.0, *)
func performSignInWithApple() {
    // Criar provedor
    let appleIDProvider = ASAuthorizationAppleIDProvider()

    // Criar pedidos
    let request = appleIDProvider.createRequest()
    request.requestedScopes = [.fullName, .email] // Solicitar nome e email do utilizador

    // Criar controlador para gerir pedidos
    let authorizationController = ASAuthorizationController(authorizationRequests: [request])

    // Definir delegados para gerir respostas
    authorizationController.delegate = self
    authorizationController.presentationContextProvider = self

    // Iniciar processo de autenticação
    authorizationController.performRequests()
}

// Implementação dos delegados
// ASAuthorizationControllerDelegate
@available(iOS 13.0, *)
extension YourViewController: ASAuthorizationControllerDelegate {
    // Gerir autenticação bem-sucedida
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
            let userIdentifier = appleIDCredential.user // Identificador único da Apple
            let fullName = appleIDCredential.fullName // Nome do utilizador
            let email = appleIDCredential.email // Email do utilizador (disponível apenas na primeira entrada)

            // Aqui pode enviar userIdentifier e outros dados para o seu servidor para verificação e criação/vinculação de conta
            print("User ID: \(userIdentifier)")
            print("Full Name: \(fullName?.givenName ?? "") \(fullName?.familyName ?? "")")
            print("Email: \(email ?? "")")
        } else if let passwordCredential = authorization.credential as? ASPasswordCredential {
            // O utilizador utilizou passwords guardadas no iCloud Keychain
            let username = passwordCredential.user
            let password = passwordCredential.password
            // Aqui pode usar esses dados para login
            print("Username: \(username)")
            print("Password: \(password)")
        }
    }

    // Gerir erro de autenticação
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        print("Falha no login com Apple: \(error.localizedDescription)")
        // Aqui trata erros (por exemplo, utilizador cancelou a autenticação)
    }
}

// ASAuthorizationControllerPresentationContextProviding
@available(iOS 13.0, *)
extension YourViewController: ASAuthorizationControllerPresentationContextProviding {
    // Fornece a janela onde será exibida a interface de autenticação
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return view.window! // É importante devolver uma janela NÃO nula
    }
}

// TODO: Certifique-se de que YourViewController implementa os protocolos necessários.
  1. Processar os dados obtidos após uma autenticação bem-sucedida:
    • Use userIdentifier para identificar de forma única o utilizador Apple.
    • fullName e email estão disponíveis apenas na primeira entrada para esse utilizador e sua aplicação. Guarde-os.
    • Envie userIdentifier, identityToken (que contém informações para verificar no servidor) e authorizationCode para o seu servidor para verificação e criação/vinculação da conta do utilizador no seu sistema.
    • O servidor deve verificar "identityToken" com a Apple para garantir a autenticidade da solicitação.

Além da autenticação principal, também é importante implementar:

  • Gestão do estado de autorização do utilizador (por exemplo, através de ASAuthorizationAppleIDProvider().getCredentialState).
  • A possibilidade de revogar a autorização pelo utilizador.
  • A interação com o seu backend para criar/autenticar o utilizador após uma autenticação bem-sucedida com a Apple.

Nota: Sign In with Apple só está disponível em dispositivos com iOS 13 / macOS Catalina e versões posteriores. Para versões mais antigas, é necessário um mecanismo de autenticação de reserva.