Aller directement au contenu

Configuration de base de l'authentification Google Supabase

GitHub

Cet guide vous guidera à travers l'intégration de l'authentification Google avec Supabase Authentication à l'aide du plugin Social Login Capacitor. Cette configuration vous permet d'utiliser l'authentification native Google sur les plateformes mobiles tout en exploitant l'authentification Supabase pour l'authentification backend.

Avant de commencer, assurez-vous d'avoir :

  1. Créé un projet Supabase

  2. Lis le context HTML text fragment from a longer Capgo UI string (parent key `read_the_style_guide`). Page/area: Capgo marketing website. Role: Website copy sentence. Seen in: page contributing.astro. Message key `read_the_style_guide` (Read The Style Guide).

  3. Configuration générale de Google Login : guide de mise en œuvre des clés OAuth Google : guide de mise en œuvre des clés OAuth Google pour votre plateforme cible :

Activation du fournisseur OAuth Google dans Supabase

Section intitulée « Activation du fournisseur OAuth Google dans Supabase »
  1. Allez sur votre Tableau de bord Supabase

  2. Cliquez sur votre projet

    Sélecteur de projet Supabase
  3. Allez-vous à la Authentication menu

    Menu d'authentification Supabase
  4. Cliquez sur la Providers onglet

    Onglet des fournisseurs Supabase
  5. Trouvez le Google fournisseur

    Fournisseur Google Supabase
  6. Activer le fournisseur

    Activer le fournisseur Google Supabase
  7. Ajoutez les identifiants de client pour les plateformes que vous prévoyez d'utiliser

    Supabase Fournisseur Google Ajouter les identifiants du client
  8. Cliquez sur le Save bouton

    Enregistrer le fournisseur Supabase Google

Voilà, vous avez maintenant activé l'authentification Google avec Supabase !

Implémentation complète

La mise en œuvre génère un paire de nonce sécurisée en suivant les exigences de nonce de Supabase Exigences de nonce de Supabase:

// Generate URL-safe random nonce
function getUrlSafeNonce(): string {
const array = new Uint8Array(32);
crypto.getRandomValues(array);
return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');
}
// Hash the nonce with SHA-256
async function sha256Hash(message: string): Promise<string> {
const encoder = new TextEncoder();
const data = encoder.encode(message);
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
}
// Generate nonce pair
async function getNonce(): Promise<{ rawNonce: string; nonceDigest: string }> {
const rawNonce = getUrlSafeNonce();
const nonceDigest = await sha256Hash(rawNonce);
return { rawNonce, nonceDigest };
}

Flux :

  • rawNonce: Chaine aléatoire sécurisée (64 caractères hexadécimaux)
  • nonceDigest: Hachage SHA-256 de rawNonce (codé en hexadécimal)
  • nonceDigest est transmis à Google Sign-In → Google inclut le nonce digest dans le jeton d'ID
  • rawNonce est transmis à Supabase → Supabase hache la nonce brute et la compare avec le nonce du jeton

La fonction initialise le plugin et se connecte avec Google :

await SocialLogin.initialize({
google: {
webClientId: 'YOUR_WEB_CLIENT_ID.apps.googleusercontent.com',
// iOS only:
iOSClientId: 'YOUR_IOS_CLIENT_ID.apps.googleusercontent.com',
mode: 'online', // Required to get idToken
},
});
const response = await SocialLogin.login({
provider: 'google',
options: {
scopes: ['email', 'profile'],
nonce: nonceDigest, // Pass the SHA-256 hashed nonce
},
});

Avant d'envoyer le jeton à Supabase, la mise en œuvre valide le jeton JWT :

function validateJWTToken(idToken: string, expectedNonceDigest: string): { valid: boolean; error?: string } {
const decodedToken = decodeJWT(idToken);
// Check audience matches your Google Client IDs
const audience = decodedToken.aud;
if (!VALID_GOOGLE_CLIENT_IDS.includes(audience)) {
return { valid: false, error: 'Invalid audience' };
}
// Check nonce matches
const tokenNonce = decodedToken.nonce;
if (tokenNonce && tokenNonce !== expectedNonceDigest) {
return { valid: false, error: 'Nonce mismatch' };
}
return { valid: true };
}

Pourquoi valider avant Supabase ?

La validation du jeton JWT avant d'envoyer le jeton à Supabase sert plusieurs objectifs importants :

  1. Prévenir les demandes non validesSi le jeton comporte une audience ou une non-convocation incorrecte, Supabase rejette le jeton de toute façon. La validation initiale évite ainsi les appels API inutiles et fournit des messages d'erreur plus clairs.

  2. Problèmes de cache de jetonsOn certain plateformes (notamment iOS), Google Sign-In SDK peut stocker des jetons pour améliorer les performances. Lorsqu'un jeton stocké est retourné, le jeton stocké peut avoir été généré avec un nonce différent (ou aucun nonce du tout), ce qui fait que Supabase rejette le jeton avec une erreur de « nonce incohérent ». En validant avant de l'envoyer à Supabase, nous pouvons détecter ce problème tôt et réessayer automatiquement avec un jeton frais.

  3. La Sécurité (iOS) : La validation s'assure que le jeton a été émis pour votre ID client Google spécifique, prévenant ainsi les problèmes de sécurité potentiels liés à l'utilisation de jetons destinés à d'autres applications.

  4. Mécanisme d'erreur amélioré: La détection des problèmes avant Supabase permet une logique de réessai automatique, essentielle pour gérer les problèmes de cache iOS de manière transparente.

Si la validation échoue, la fonction se déconnecte automatiquement de Google (efface les jetons stockés - critique sur iOS)

  1. Réessaye l'authentification une fois (force la génération d'un jeton frais avec un nonce correct)
  2. Si la réessai échoue également, retourne une erreur
  3. 4. Supabase Sign-In

Enfin, le jeton validé est envoyé à Supabase :

Sécurité

Section intitulée « 4. Supabase Sign-In »

const { data, error } = await supabase.auth.signInWithIdToken({
provider: 'google',
token: googleResponse.idToken,
nonce: rawNonce, // Pass the raw (unhashed) nonce
});

La mise en œuvre complète est disponible dans le fichier de l'application d'exemple, qui comprend : supabaseAuthUtils.ts – Génère un jeton sécurisé pour URL

  • getUrlSafeNonce() – Hache une chaîne avec SHA-256
  • sha256Hash() – Génère un couple de jetons
  • getNonce() – Décode le jeton JWT
  • decodeJWT() – Valide l'audience et le jeton JWT
  • validateJWTToken() – Fonction d'authentification principale avec réessai automatique
  • authenticateWithGoogleSupabase() – Les fonctionnalités suivantes sont disponibles dans le fichier de l'application d'exemple :

Veuillez procéder au guide de configuration spécifique à la plateforme pour votre plateforme cible :

Continuez de Supabase Google Login - Configuration Générale

Titre de la section « Continuez de Supabase Google Login - Configuration Générale »

Si vous utilisez Supabase Google Login - Configuration Générale pour planifier l'authentification et les flux de compte, connectez-l’avec En utilisant @capgo/capacitor-social-login pour la capacité native dans En utilisant @capgo/capacitor-social-login En utilisant @capgo/capacitor-social-login pour le détail d'implémentation dans En utilisant @capgo/capacitor-social-login En utilisant @capgo/capacitor-passkey pour le détail d'implémentation dans En utilisant @capgo/capacitor-passkey En utilisant @capgo/capacitor-native-biometric pour les détails d'implémentation dans @capgo/capacitor-native-biometric, et Authentification à deux facteurs pour les détails d'implémentation dans Authentification à deux facteurs.