Saltar al contenido

Inicio de Sesión de Google con Supabase en iOS

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 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.

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);
}

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.

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:

  1. Detección Automática: La función verifica si el nonce en el token coincide con el nonceDigest esperado
  2. Reintento Automático: Si la validación falla, automáticamente cierra sesión de Google y reintenta una vez
  3. 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 autentica
const 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.

La implementación del nonce sigue el patrón de la documentación de React Native Google Sign In:

  • rawNonce va al signInWithIdToken() de Supabase
  • Supabase crea un hash del rawNonce y lo compara con el nonceDigest que está incluido en el token ID de Google Sign-In
  • nonceDigest (hash SHA-256, codificado en hexadecimal) va al parámetro nonce en las APIs de Google Sign-In

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.

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