Saltare al contenuto

Configurazione generale di Supabase Google Login

GitHub

Questa guida ti guiderà attraverso l'integrazione di Google Sign-In con l'autenticazione Supabase utilizzando il plugin di accesso sociale Capacitor. Questa configurazione consente di utilizzare l'accesso di segno di Google nativo sui piattaforme mobili, mentre si utilizza l'autenticazione Supabase per l'autenticazione backend.

Prima di iniziare, assicurati di avere:

  1. Creato un progetto Supabase

  2. Letto il guida generale per la configurazione dei credenziali di accesso Google Seguito le guide specifiche per la piattaforma per configurare i credenziali di accesso Google per la tua piattaforma di destinazione:

  3. Configurazione generale di Google Login

Abilitazione del provider OAuth Google in Supabase

Sezione intitolata “Abilitazione del provider OAuth Google in Supabase”
  1. Vai al tuo Pannello di controllo di Supabase

  2. Clicca sul tuo progetto

    Selettore dei progetti di Supabase
  3. Andare al Authentication menu

    Menu di autenticazione Supabase
  4. Cliccare sul Providers tab

    Tabella dei provider Supabase
  5. Trovare il Google provider

    Provider Google Supabase
  6. Abilitare il provider

    Abilita il provider Google Supabase
  7. Aggiungere gli ID client per le piattaforme che intendi utilizzare

    Aggiungi ID Client Supabase Google
  8. Clicca sul Save bottone

    Salva Fornitore Supabase Google

Questa sezione spiega come funziona l'integrazione dell'accesso con Google con l'autenticazione Supabase sotto la pelle. Capire questo flusso ti aiuterà a implementare e a risolvere i problemi di autenticazione.

Il completo implementazione è disponibile nel

file dell'applicazione di esempio.

E o, hai ora abilitato l'accesso con Google con l'autenticazione Supabase.

L'implementazione genera un pair di nonce sicuro in base alle Requisiti di nonce di 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 };
}

Corsa:

  • rawNonce: stringa casuale sicura per URL (64 caratteri esadecimali)
  • nonceDigest: hash SHA-256 di rawNonce (codificato in esadecimale)
  • nonceDigest viene passato a Google Sign-In → Google include il nonce digest nel token ID
  • rawNonce viene passato a Supabase → Supabase hasha il nonce raw e lo confronta con il nonce del token

La funzione inizializza il plugin e si connette con 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
},
});

Prima di inviare il token a Supabase, l'implementazione valuta il token 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 };
}

Perché validare prima di Supabase?

La validazione del token JWT prima di inviare il token a Supabase serve diversi scopi importanti:

  1. Prevenire richieste non valide: Se il token ha un'audience o un nonce errato, Supabase rifiuterà comunque il token. Validare prima evita chiamate API non necessarie e fornisce messaggi di errore più chiari.

  2. Issue di cache dei tokenOn alcune piattaforme (soprattutto iOS), Google Sign-In SDK può memorizzare i token per prestazioni. Quando un token memorizzato viene restituito, il token memorizzato potrebbe essere stato generato con un diverso nonce (o nessun nonce affatto), causando che Supabase rifiuti il token con un errore di "mismatch nonce". Validando prima di inviare a Supabase, possiamo rilevare questo problema in anticipo e riprovare automaticamente con un token fresco.

  3. Sicurezza (iOS): Sulla piattaforma iOS, la validazione assicura che il token sia stato emesso per i Client ID Google specifici, prevenendo potenziali problemi di sicurezza dall'utilizzo di token destinati ad altre applicazioni.

  4. Miglioramento dell'errore: Rilevando i problemi prima di inviare a Supabase consente la logica di riprova automatica, essenziale per gestire trasparentemente le problematiche di caching iOS.

Se la validazione fallisce, la funzione esegue automaticamente:

  1. Si disconnette da Google (elimina i token memorizzati - critico su iOS)
  2. Riprova l'autenticazione una volta (forza la generazione di un token fresco con nonce corretto)
  3. Se anche la riprova fallisce, restituisce un errore

Infine, il token validato viene inviato a Supabase:

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

La completa implementazione è disponibile nell' esempio di applicazione supabaseAuthUtils.ts file, che include:

  • getUrlSafeNonce() - Genera un nonce sicuro per l'URL
  • sha256Hash() - Cifra una stringa con SHA-256
  • getNonce() - Genera coppia nonce
  • decodeJWT() - Decodifica token JWT
  • validateJWTToken() - Valida l'audience e il nonce JWT
  • authenticateWithGoogleSupabase() - Funzione di autenticazione principale con ritentativo automatico

Procedere al seguente percorso di configurazione specifico per la piattaforma di destinazione:

Continua dall'accesso Google di Supabase - Configurazione generale

Titolo della sezione “Continua dall'accesso Google di Supabase - Configurazione generale”

Se stai utilizzando Supabase Google Login - Configurazione generale per pianificare l'autenticazione e le flussi di account, connettilo con Utilizza @capgo/capacitor-login-social per la capacità nativa in Utilizza @capgo/capacitor-login-social Utilizza @capgo/capacitor-login-social per il dettaglio di implementazione in @capgo/capacitor-login-social Utilizza @capgo/capacitor-passkey per il dettaglio di implementazione in @capgo/capacitor-passkey Utilizza @capgo/capacitor-biometrica-nativa per i dettagli di implementazione in @capgo/capacitor-native-biometric, e Autenticazione a due fattori per i dettagli di implementazione in Autenticazione a due fattori.