Sobes.tech
Middle+

¿Cómo implementar la autorización a través de Apple en una aplicación iOS?

sobes.tech AI

Respuesta de la IA

Para implementar la autenticación con Apple (Iniciar sesión con Apple) en una aplicación iOS, se requieren los siguientes pasos:

  1. Configurar la aplicación en el Apple Developer Portal:

    • Activar la capacidad "Iniciar sesión con Apple" para tu App ID.
    • Generar o actualizar el Perfil de Provisión con la capacidad activada.
  2. Añadir la capacidad "Iniciar sesión con Apple" en el proyecto Xcode.

  3. Utilizar el framework AuthenticationServices.

Ejemplo de código para iniciar la solicitud de autenticación:

import AuthenticationServices

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

    // Crear solicitudes
    let request = appleIDProvider.createRequest()
    request.requestedScopes = [.fullName, .email] // Solicitar nombre y correo del usuario

    // Crear controlador para manejar solicitudes
    let authorizationController = ASAuthorizationController(authorizationRequests: [request])

    // Establecer delegados para manejar respuestas
    authorizationController.delegate = self
    authorizationController.presentationContextProvider = self

    // Iniciar proceso de autenticación
    authorizationController.performRequests()
}

// Implementación de delegados
// ASAuthorizationControllerDelegate
@available(iOS 13.0, *)
extension YourViewController: ASAuthorizationControllerDelegate {
    // Manejar autenticación exitosa
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
            let userIdentifier = appleIDCredential.user // Identificador único de Apple
            let fullName = appleIDCredential.fullName // Nombre del usuario
            let email = appleIDCredential.email // Correo del usuario (disponible solo en el primer ingreso)

            // Aquí puedes enviar userIdentifier y otros datos a tu servidor para verificación y creación/vinculación de cuenta
            print("User ID: \(userIdentifier)")
            print("Full Name: \(fullName?.givenName ?? "") \(fullName?.familyName ?? "")")
            print("Email: \(email ?? "")")
        } else if let passwordCredential = authorization.credential as? ASPasswordCredential {
            // El usuario usó contraseñas guardadas en iCloud Keychain
            let username = passwordCredential.user
            let password = passwordCredential.password
            // Aquí puedes usar estos datos para iniciar sesión
            print("Username: \(username)")
            print("Password: \(password)")
        }
    }

    // Manejar error de autenticación
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        print("Falló el inicio de sesión con Apple: \(error.localizedDescription)")
        // Aquí manejamos errores (por ejemplo, usuario canceló la autorización)
    }
}

// ASAuthorizationControllerPresentationContextProviding
@available(iOS 13.0, *)
extension YourViewController: ASAuthorizationControllerPresentationContextProviding {
    // Proporciona la ventana en la que se mostrará la interfaz de autorización
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return view.window! // Es importante devolver una ventana NO nula
    }
}

// TODO: Asegúrate de que YourViewController implemente los protocolos necesarios.
  1. Procesar los datos obtenidos tras una autorización exitosa:
    • Usa userIdentifier para identificar de forma única al usuario de Apple.
    • fullName y email solo están disponibles en el primer ingreso de ese usuario y tu aplicación. Guárdalos.
    • Envía userIdentifier, identityToken (que contiene información para verificar en el servidor) y authorizationCode a tu servidor para verificar y crear/vincular la cuenta del usuario en tu sistema.
    • El servidor debe verificar "identityToken" con Apple para asegurar la autenticidad de la solicitud.

Además de la autorización principal, también es importante implementar:

  • Manejo del estado de autorización del usuario (por ejemplo, mediante ASAuthorizationAppleIDProvider().getCredentialState).
  • La opción de revocar la autorización por parte del usuario.
  • La interacción con tu backend para crear/autenticar al usuario tras una autorización exitosa con Apple.

Nota: Sign In with Apple solo está disponible en dispositivos con iOS 13 / macOS Catalina y versiones posteriores. Para versiones más antiguas, se requiere un mecanismo de autenticación alternativo.