Saltar al contenido principal

Antes de comenzar

Completa estos requisitos previos antes de seguir este inicio rápido:
  1. Configura el SDK de Facebook Login - Instala y configura el Facebook Login SDK for iOS. Crea una aplicación de Facebook en developers.facebook.com. Cuando termines, tu aplicación debería tener Facebook Login funcionando.
  2. Configura Auth0 para Facebook Native - Configura tu aplicación de Auth0 para usar el inicio de sesión nativo de Facebook. Consulta Agregar Facebook Login a aplicaciones nativas.

Primeros pasos

1

Configurar los permisos de Facebook Login

Actualiza el botón de Facebook Login en tu ViewController para solicitar los permisos correctos.Tu aplicación ya admite Facebook Login, pero para obtener un perfil de usuario más completo debes solicitar los permisos public_profile y email. También agregarás una llamada de retorno del delegado para iniciar el flujo de autenticación de Auth0.
ViewController.swift
import FacebookLogin
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let fbLoginButton = FBLoginButton()
        // Solicitar permisos de email y public_profile
        fbLoginButton.permissions = ["email", "public_profile"]
        fbLoginButton.delegate = self
        view.addSubview(fbLoginButton)
    }

    private func performLogin(accessToken: AccessToken) {
        // Los pasos 2–4 completarán este campo
    }
}

extension ViewController: LoginButtonDelegate {
    func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: (any Error)?) {
        if let error = error {
            // Gestionar error de inicio de sesión de Facebook
            print(error)
            return
        }
        if let result = result, let token = result.token {
            performLogin(accessToken: token)
        }
    }

    func loginButtonDidLogOut(_ loginButton: FBLoginButton) {
        // Gestionar cierre de sesión
    }

    func loginButtonWillLogin(_ loginButton: FBLoginButton) -> Bool {
        return true
    }
}
El permiso email es opcional; el usuario debe dar su consentimiento para compartirlo. El correo electrónico que devuelve Facebook se marcará como no verificado en el perfil del usuario de Auth0.
2

Instala y configura el SDK de Auth0

Agrega el SDK Auth0.swift a tu proyecto y configura las credenciales de tu aplicación.Agrega Auth0.swift con Swift Package Manager:
  1. En Xcode, ve a FileAdd Package Dependencies…
  2. Ingresa la URL del paquete: https://github.com/auth0/Auth0.swift
  3. Selecciona la versión más reciente y haz clic en Add Package
Agrega tus credenciales de Auth0 a Auth0.plist:Ve a la sección Applications del Auth0 Dashboard y selecciona la aplicación en la que habilitaste Facebook Native Sign In. Copia los valores de dominio e ID de cliente.Crea un nuevo archivo de lista de propiedades llamado Auth0.plist en tu proyecto y agrega lo siguiente:
Auth0.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ClientId</key>
    <string>YOUR_AUTH0_CLIENT_ID</string>
    <key>Domain</key>
    <string>{yourDomain}</string>
</dict>
</plist>
Arrastra Auth0.plist a Xcode y asegúrate de que Add to target esté marcado para el destino de tu aplicación.
El SDK de Auth0.swift lee automáticamente las credenciales de Auth0.plist, por lo que no se requiere código de inicialización adicional.
3

Obtener el token de acceso de la sesión de Facebook

Después de que Facebook Login se complete correctamente, obtén un token de acceso de sesión de la API de Facebook. Auth0 requiere este token para verificar la identidad del usuario en el backend.Haz una solicitud GET al endpoint /oauth/access_token de Facebook mediante la clase GraphRequest:
ViewController.swift
import FacebookCore

private func fetchSessionToken(accessToken: AccessToken, completion: @escaping (String?, Error?) -> Void) {
    let request = GraphRequest(graphPath: "oauth/access_token")
    request.parameters["grant_type"] = "fb_attenuate_token"
    request.parameters["client_id"] = facebookAppId()
    request.parameters["fb_exchange_token"] = accessToken.tokenString
    request.start { _, response, error in
        if let error = error {
            completion(nil, error)
            return
        }
        if let responseDict = response as? [String: Any],
           let token = responseDict["access_token"] as? String {
            completion(token, nil)
        }
    }
}

private func facebookAppId() -> String? {
    return Bundle.main.infoDictionary?["FacebookAppID"] as? String
}
Los parámetros de consulta obligatorios son:
  • grant_type: fb_attenuate_token
  • fb_exchange_token: la cadena del token del AccessToken de Facebook
  • client_id: el ID de tu aplicación de Facebook (ya está en tu Info.plist de la configuración del SDK de Facebook)
4

Obtener el perfil de usuario de Facebook

Obtén el perfil del usuario desde Facebook. Auth0 usa estos datos para crear o actualizar el perfil del usuario en Auth0.
ViewController.swift
import FacebookCore

private func fetchUserProfile(completion: @escaping ([String: Any]?, Error?) -> Void) {
    let request = GraphRequest(graphPath: "me")
    request.parameters["fields"] = "first_name,last_name,email"
    request.start { _, result, error in
        if let error = error {
            completion(nil, error)
            return
        }
        if let rawResponse = result as? [String: Any] {
            completion(rawResponse, nil)
        }
    }
}
El parámetro fields se corresponde directamente con los permisos de Facebook que solicitaste. Solicitar first_name, last_name y email es suficiente para que Auth0 cree un perfil de usuario completo.
5

Canjear tokens por credenciales de Auth0

Usa el token de sesión y el perfil del usuario de los pasos anteriores para autenticarte con Auth0 y obtener tokens de Auth0.Llama a login(facebookSessionAccessToken:profile:audience:scope:) en el cliente de autenticación de Auth0:
ViewController.swift
import Auth0

private func exchangeToken(sessionToken: String, userProfile: [String: Any], completion: @escaping (Credentials?, Error?) -> Void) {
    Auth0.authentication()
        .login(
            facebookSessionAccessToken: sessionToken,
            profile: userProfile,
            audience: nil,
            scope: "openid profile email offline_access"
        )
        .start { result in
            switch result {
            case .success(let credentials):
                completion(credentials, nil)
            case .failure(let error):
                completion(nil, error)
            }
        }
}
Internamente, Auth0.swift usa el tipo de token http://auth0.com/oauth/token-type/facebook-info-session-access-token para dirigir la solicitud a la conexión nativa de Facebook.
6

Ponerlo todo junto

Complete el método performLogin para encadenar los tres pasos: obtener el token de sesión → obtener el perfil de usuario → intercambiarlo por tokens de Auth0.
ViewController.swift
private func performLogin(accessToken: AccessToken) {
    fetchSessionToken(accessToken: accessToken) { [weak self] token, error in
        guard let self = self else { return }
        if let error = error {
            print("Session token error:", error)
            return
        }
        guard let token = token else { return }

        self.fetchUserProfile { userProfile, error in
            if let error = error {
                print("Profile fetch error:", error)
                return
            }
            guard let userProfile = userProfile else { return }

            self.exchangeToken(sessionToken: token, userProfile: userProfile) { credentials, error in
                if let error = error {
                    print("Token exchange error:", error)
                    return
                }
                if let credentials = credentials {
                    // ¡Autenticado! Guardar credenciales y actualizar la interfaz
                    print("Access token:", credentials.accessToken)
                }
            }
        }
    }
}
Mantén las constantes (permisos de Facebook y alcances de Auth0) en la parte superior de la clase para evitar cadenas mágicas. Considera usar async/await para simplificar las devoluciones de llamada anidadas si trabajas con iOS 15 o versiones posteriores.
VerificaciónAhora deberías poder autenticarte de forma nativa con Facebook. Si la aplicación de Facebook está instalada en el dispositivo, la autenticación se realiza directamente a través de la aplicación, sin necesidad de usar un navegador.

Solución de problemas y temas avanzados

El intercambio de tokens falla con un error de autenticación

Soluciones:
  1. Verifica que tu aplicación de Auth0 tenga habilitado Facebook Native Sign In en el Dashboard
  2. Comprueba que FacebookAppID en Info.plist coincida con el ID de la aplicación en la consola de desarrolladores de Facebook
  3. Asegúrate de que el archivo Auth0.plist esté agregado al target correcto en Xcode
  4. Confirma que el token de acceso de Facebook no haya expirado antes de llamar a performLogin

La solicitud del token de sesión devuelve un error

Solución:
  • Verifica que FacebookAppID esté configurado correctamente en Info.plist
  • Asegúrate de que fb_exchange_token sea la cadena sin procesar del token (accessToken.tokenString)
  • Comprueba que tu aplicación de Facebook no esté en modo de desarrollo si estás haciendo pruebas con usuarios que no son administradores

AuthenticationError: “Connection not found”

Solución:
  1. Ve a Auth0 Dashboard → AuthenticationSocial
  2. Verifica que Sign in with Facebook esté habilitado
  3. Confirma que Facebook Native Social Login esté activado en la configuración de la conexión
  4. Comprueba que la aplicación de Auth0 esté asociada con la conexión de Facebook

Faltan campos en el perfil del usuario

  • Confirma que "email" y "public_profile" estén en el array fbLoginButton.permissions
  • Es posible que el usuario haya rechazado el permiso email; maneja correctamente el caso de un correo electrónico nulo
  • Verifica que los mismos campos estén en la llamada request.parameters["fields"] de fetchUserProfile

No se encontró Auth0.plist

  • Asegúrate de que el nombre del archivo sea exactamente Auth0.plist (distingue entre mayúsculas y minúsculas)
  • En Xcode, comprueba el Target Membership del archivo: debe estar incluido en el target de tu aplicación

Prácticas recomendadas de seguridad

  • Almacenamiento seguro de tokens: Usa CredentialsManager de Auth0.swift para almacenar los tokens de forma segura en el llavero de iOS
  • Tokens de actualización: Solicita el scope offline_access y usa CredentialsManager para renovar silenciosamente los tokens expirados
  • Protección biométrica: Habilita la autenticación biométrica en CredentialsManager para proteger las credenciales almacenadas

Configuración de la aplicación de Facebook

  • Cambia tu aplicación de Facebook de Development Mode a Live antes de publicarla en la App Store
  • Asegúrate de que el Bundle ID de tu aplicación esté registrado en la consola de desarrolladores de Facebook
  • Revisa los requisitos de la Data Policy de Facebook para las aplicaciones que usan el Login SDK

Envío a la App Store

  • Incluye Facebook Login en la política de privacidad de tu aplicación y en la etiqueta de privacidad de la App Store
  • Gestiona los casos en los que el usuario deniegue el permiso email; tu aplicación debe funcionar sin él
  • Haz pruebas en un dispositivo real antes de enviar la app; el SDK de Facebook se comporta de manera diferente en los simuladores
Si tu app es compatible con iOS 15+, puedes usar async/await para escribir código más limpio y sin anidamiento:
ViewController.swift
@MainActor
private func performLogin(accessToken: AccessToken) async {
    do {
        let sessionToken = try await fetchSessionTokenAsync(accessToken: accessToken)
        let userProfile = try await fetchUserProfileAsync()
        let credentials = try await exchangeTokenAsync(sessionToken: sessionToken, userProfile: userProfile)
        // ¡Autenticado! Almacena las credenciales y actualiza la UI
        print("Access token:", credentials.accessToken)
    } catch {
        print("Authentication failed:", error)
    }
}
Envuelve cada método basado en callbacks en un withCheckedThrowingContinuation para adaptarlo a async/await.

Próximos pasos

Configurar otros proveedores de identidad

Añada Google, Apple y otros proveedores de inicio de sesión social

Protección contra ataques

Protéjase frente a ataques de fuerza bruta y de bots

Actions

Personalice los flujos de autenticación con código sin servidor

Referencia del SDK de iOS

Consulte la documentación completa del SDK Auth0.swift