Inicio de Sesión de Google con Supabase en iOS
Introducción
Section titled “Introducción”Esta guía te ayudará a integrar el inicio de sesión de Google con Supabase Authentication en iOS. Se asume que ya has completado:
- la configuración de inicio de sesión de Google en iOS
- la Configuración General de inicio de sesión de Google con Supabase.
Implementación
Section titled “Implementación”La implementación completa está disponible en el archivo supabaseAuthUtils.ts de la aplicación de ejemplo. Esta guía explica los conceptos clave y cómo usarlo.
Uso del Helper de Autenticación
Section titled “Uso del Helper de Autenticación”La función authenticateWithGoogleSupabase maneja todo el flujo de autenticación:
import { authenticateWithGoogleSupabase } from './supabaseAuthUtils';
const result = await authenticateWithGoogleSupabase();if (result.success) { console.log('Signed in:', result.user); // Navega a tu área autenticada} else { console.error('Error:', result.error);}Cómo Funciona
Section titled “Cómo Funciona”Para una explicación detallada de cómo funciona el flujo de autenticación, incluyendo la generación de nonce, la validación de JWT y el inicio de sesión en Supabase, consulta la sección Cómo Funciona en la guía de Configuración General.
Advertencias Importantes
Section titled “Advertencias Importantes”Caché de Tokens de iOS y Problemas de Nonce
Section titled “Caché de Tokens de iOS y Problemas de Nonce”Problema de Caché de Nonce en iOS
En iOS, Google Sign-In puede cachear tokens, lo que puede causar que la validación de nonce falle. La función validateJWTToken detecta esto y lo maneja automáticamente:
- Detección Automática: La función verifica si el nonce en el token coincide con el
nonceDigestesperado - Reintento Automático: Si la validación falla, automáticamente cierra sesión de Google y reintenta una vez
- Manejo de Errores: Si el reintento también falla, se devuelve un error
Por qué sucede esto: El SDK de Google Sign-In en iOS cachea tokens por rendimiento. Cuando se devuelve un token en caché, puede haber sido generado con un nonce diferente (o sin nonce), causando una discrepancia.
La solución: La implementación maneja esto automáticamente cerrando sesión y reintentando, lo que fuerza a Google a generar un token fresco con el nonce correcto.
Solución Manual (si el reintento automático no funciona):
// Cierra sesión primero para limpiar tokens en cachéawait SocialLogin.logout({ provider: 'google' });
// Luego autenticaconst result = await authenticateWithGoogleSupabase();Esto asegura que se obtenga un token fresco con el nonce correcto.
Para la referencia completa del código, consulta la sección Referencia Completa del Código en la guía de Configuración General.
Notas Importantes
Section titled “Notas Importantes”Manejo de Nonce
Section titled “Manejo de Nonce”La implementación del nonce sigue el patrón de la documentación de React Native Google Sign In:
rawNonceva alsignInWithIdToken()de Supabase- Supabase crea un hash del
rawNoncey lo compara con elnonceDigestque está incluido en el token ID de Google Sign-In nonceDigest(hash SHA-256, codificado en hexadecimal) va al parámetrononceen las APIs de Google Sign-In
Mecanismo de Reintento Automático
Section titled “Mecanismo de Reintento Automático”La función authenticateWithGoogleSupabase incluye un parámetro retry:
- Primera llamada (
retry=false): Si la validación falla, automáticamente cierra sesión y reintenta una vez - Llamada de reintento (
retry=true): Si la validación falla de nuevo, devuelve inmediatamente un error
Esto maneja el problema de caché de tokens de iOS automáticamente.
Solución de Problemas
Section titled “Solución de Problemas”Si la autenticación falla:
- Discrepancia de nonce: La función reintenta automáticamente - revisa los logs de la consola para detalles. Si persiste, cierra sesión manualmente primero
- Audiencia inválida: Verifica que tus IDs de cliente de Google coincidan tanto en la consola de Google Cloud como en Supabase (tanto iOS como IDs de cliente Web)
- La validación del token falla: Asegúrate de estar usando
mode: 'online'en la llamada de inicialización para obtener un idToken - Configuración de Info.plist: Asegúrate de que Info.plist tenga los esquemas de URL correctos y GIDClientID
- Revisa el código de la aplicación de ejemplo como referencia