Vai al contenuto

Basi della sicurezza

Errore Supabase: "Unsupported provider: provider is not enabled"

"Unsupported provider: provider is not enabled": Google è disattivato nel tuo progetto Supabase. Come attivarlo e risolvere redirect_uri_mismatch.

Vlad Tkachenko9 min di lettura
Un elenco di impostazioni con un provider tirato in avanti: interruttore spento, bordato in ambra, e due campi per le chiavi vuoti.

In breve

  • "Unsupported provider: provider is not enabled" significa che il progetto Supabase a cui la tua app ha mandato la persona ha l'accesso con Google disattivato. Attivalo in Authentication, Sign In / Providers, in quello stesso progetto.
  • Poi Google controlla una lista sua. L'URL di callback di Supabase deve stare nelle Authorized redirect URIs del tuo client OAuth, lettera per lettera, altrimenti Google risponde redirect_uri_mismatch.
  • Il Client Secret va nella dashboard di Supabase e da nessun'altra parte. Il codice della tua app non ne ha mai bisogno.

Aggiungi un pulsante "Accedi con Google" alla tua app e lo premi. Invece della scelta dell'account di Google, il browser mostra questo:

{"code":400,"error_code":"validation_failed","msg":"Unsupported provider: provider is not enabled"}

La barra degli indirizzi mostra il tuo progetto Supabase, qualcosa come https://abcdefghij.supabase.co/auth/v1/authorize?provider=google&redirect_to=…. Hai costruito l'app con Lovable, Bolt, v0, Cursor, Claude Code o Replit, il pulsante è arrivato con il codice, e in quel codice niente sembra sbagliato.

"Unsupported provider: provider is not enabled" significa che Supabase Auth, la parte di Supabase che fa accedere le persone, ha Google disattivato nel progetto con cui parla la tua app. La soluzione è un interruttore e due valori che ti dà Google. Dopo, Google controlla una lista sua, ed è da quella lista che arriva l'errore successivo, redirect_uri_mismatch.

La trappola è in quella seconda lista. L'indirizzo che sembra giusto per lei è quello della tua app, e Google non lo usa mai, perché Google non manda mai nessuno alla tua app.

Cosa significa "Unsupported provider: provider is not enabled"?

Significa che Supabase si è rifiutato di avviare un accesso con Google, perché Google è disattivato nel progetto che ha ricevuto la richiesta.

Accedere con Google è un viaggio di andata e ritorno attraverso due reception. La tua app manda la persona alla reception di Supabase. Supabase la manda alla reception di Google per dimostrare chi è, Google la rimanda a Supabase, e Supabase la riporta a casa, nella tua app, con l'accesso fatto. Ogni reception manda le persone solo dove le sue impostazioni lo permettono. Questo messaggio è la reception di Supabase che dice che lo sportello di Google è chiuso.

Nel codice sorgente di Supabase Auth, una richiesta a /auth/v1/authorize cerca prima il provider, e qualsiasi problema con lui torna come un 400, con il codice validation_failed e Unsupported provider: davanti al motivo. provider is not enabled è la prima cosa che quella ricerca controlla.

Quindi Google non ha mai visto la richiesta, e niente nella console di Google la spiegherà. Neanche la tua app vede l'errore: la libreria JavaScript di Supabase manda l'intero browser a quell'indirizzo, quindi la pagina che fallisce è di Supabase, e la console della tua app resta vuota.

Lo stesso messaggio compare con GitHub, Apple o qualsiasi altro provider disattivato, e l'interruttore è nello stesso posto. Le app sul backend integrato di Lovable sono configurate in un altro modo: la documentazione sull'autenticazione di Lovable descrive Google come "managed by Lovable with no setup, or your own Google Cloud OAuth credentials." Questo articolo è per le app sul tuo progetto Supabase, qualunque sia lo strumento con cui le hai costruite.

Supabase risponde prima che Google venga interpellato, quindi l'errore è di Supabase e la soluzione sta in Supabase.

È il progetto Supabase giusto?

Controllalo prima di cambiare qualsiasi cosa, perché la pagina di errore nomina il progetto che ha risposto.

L'indirizzo della pagina di errore comincia con il riferimento del tuo progetto, la sequenza di lettere prima di .supabase.co. Apri la dashboard di Supabase e guarda la sua barra degli indirizzi: lo stesso riferimento segue /project/. Se i due sono diversi, la tua app parla con un altro progetto, per esempio uno che un builder ha creato per te o una copia che hai fatto per le prove. È in quel progetto che Google va attivato.

Come risolvere "Unsupported provider: provider is not enabled"

Crea un client OAuth su Google, poi attiva Google in Supabase con i due valori che ti dà. La guida all'accesso con Google di Supabase ha i passaggi; eccoli nell'ordine in cui li chiedono le due console. Le etichette sono quelle delle due interfacce in inglese.

In Supabase, copia prima l'URL di callback. Vai su Authentication, poi su Sign In / Providers, e apri Google. Il pannello mostra una Callback URL con un pulsante per copiarla. Ha questa forma: https://<project-ref>.supabase.co/auth/v1/callback.

In Google Cloud, crea il client. Nella pagina Clients di Google Auth Platform, crea un ID client OAuth di tipo Web application.

  • In Authorized JavaScript origins, aggiungi l'indirizzo della tua app, per esempio https://yourapp.com.
  • In Authorized redirect URIs, incolla l'URL di callback che hai copiato da Supabase.
  • Premi Create e copia subito il Client ID e il Client Secret. La pagina di aiuto di Google sui client OAuth avverte: "you will only be able to view and download the full client secret once, at the time of its creation."

Di nuovo in Supabase, attivalo. Attiva Enable Sign in with Google, incolla il Client ID in Client IDs e il secret in Client Secret (for OAuth), e salva. La dashboard non salva Google attivo senza un Client ID, ma lo salva con il campo del secret vuoto. La descrizione di quel campo dice che il secret serve per "the OAuth flow on the web", e un pulsante in un'app web è proprio quel flusso.

Poi premi di nuovo il tuo pulsante. Se il messaggio comincia ancora con "Unsupported provider", la sua fine ti dice cosa manca:

Il messaggio finisce conCosa vuol direCosa cambiare
provider is not enabledGoogle è disattivato nel progetto che ha rispostoAttivarlo in quel progetto
missing OAuth client IDGoogle è attivo senza un Client ID salvatoIncollare il Client ID
missing OAuth secretGoogle è attivo e il campo del secret è vuotoIncollare il secret, o premere Add Secret sul client in Google se non ce l'hai più
Provider … could not be foundIl tuo codice chiede un provider che Supabase non haUsare google come provider in signInWithOAuth

Perché poi Google risponde redirect_uri_mismatch

Perché il tuo URL di callback non è nella lista del client, scritto esattamente come lo manda Supabase.

Questa è la seconda reception. Quando Supabase avvia l'accesso, passa la persona a Google con un biglietto che dice dove rimandarla: l'URL di callback del tuo progetto. Google confronta quel biglietto con le Authorized redirect URIs del client che hai creato. La sua documentazione OAuth descrive l'errore in una riga: "The redirect_uri passed in the authorization request does not match an authorized redirect URI for the OAuth client ID."

La corrispondenza è esatta. La stessa pagina dice: "the http or https scheme, case, and trailing slash ('/') must all match." Quindi una voce che finisce con /auth/v1/callback/, con una barra in fondo, non corrisponde all'indirizzo che manda Supabase.

L'indirizzo della tua app non fa niente in questa lista. Google rimanda le persone a Supabase, quindi l'unico indirizzo che controlla è il callback di Supabase. L'indirizzo della tua app va nella lista dell'altra reception, Redirect URLs in Supabase, che decide dove Supabase manda le persone alla fine di tutto. Quando quella lista è sbagliata, le persone tornano con l'accesso fatto su localhost:3000, e per questo c'è un articolo apposta.

Dopo aver salvato, dai a Google un po' di tempo. La sua pagina di aiuto sui client OAuth dice: "It may take 5 minutes to a few hours for changes made to these settings to take effect."

Ogni reception controlla la propria lista. Quella di Google ha bisogno del callback di Supabase, quella di Supabase della tua app.

Dove va il Client Secret

Nella dashboard di Supabase, e da nessun'altra parte. Il codice della tua app non ne ha mai bisogno.

Il Client ID è pubblico: viaggia nell'indirizzo della pagina di accesso di Google, dove chiunque può leggerlo. Il Client Secret è ciò che dimostra a Google che una richiesta arriva dalla tua parte, e in questa configurazione ce l'ha solo Supabase. Quando la tua app chiama signInWithOAuth, la libreria manda il browser a Supabase, ed è Supabase Auth a parlare con Google usando il secret.

Quindi, se il tuo builder ha messo il secret nel codice della tua app, o in una variabile il cui nome comincia con VITE_ o NEXT_PUBLIC_, è nel browser di ogni visitatore. Quelle variabili sono pubbliche per progetto. La pagina di aiuto di Google è chiara: "Never add client secrets directly in your code or check them into version control systems such as Git or Subversion." Sostituiscilo nella pagina del client nella console di Google: premi Add Secret, incolla il nuovo secret in Supabase, poi Disable su quello vecchio ed eliminalo. Togli anche il vecchio valore dal tuo codice.

Per controllare cosa consegna ai visitatori la tua app online non serve aprire il builder. La nostra scansione gratuita legge la tua app online come fa il browser di un visitatore e segnala le chiavi segrete che riconosce, insieme alle tabelle che rispondono a chiunque e agli header mancanti. Dura circa 20 secondi e non chiede un account: scansiona la tua app.

Tenere d'occhio l'app in cui ora le persone accedono

Appena le persone accedono con Google, i loro account vivono nel tuo progetto Supabase, e l'app in cui accedono cambia a ogni deploy.

Reeve Monitor continua a controllare la tua app online:

  • se risponde, ogni 60 secondi
  • tutti e nove i controlli ogni ora, su un massimo di tre app, comprese le chiavi segrete nel codice che la tua app invia ai visitatori
  • un messaggio quando un risultato cambia, così una chiave uscita con un deploy successivo ti raggiunge senza che tu debba andare a guardare
  • un report mensile, in linguaggio semplice, di quello che ha visto

Reeve Care tiene una copia del tuo database Supabase, account compresi:

  • una copia cifrata secondo una pianificazione, sullo spazio di archiviazione di Reeve nell'UE, fuori dal tuo account Supabase
  • lo schema auth, dove Supabase tiene ogni utente e l'identità Google con cui ha fatto l'accesso, così tornano insieme a tutto il resto
  • ogni copia verificata prima che conti, contando le righe di ogni tabella
  • anche i tuoi file caricati, appena colleghi una credenziale di Storage
  • un ripristino in un clic, con una copia di sicurezza dello stato attuale presa prima
  • tutto quello che fa Monitor

Cosa fare adesso

Cosa fare

  • Leggi il riferimento del progetto nella pagina di errore e attiva Google in quel progetto, in Authentication, Sign In / Providers.
  • Crea su Google un client di tipo Web application, con il tuo URL di callback di Supabase in Authorized redirect URIs, esattamente come lo mostra Supabase.
  • Incolla il Client ID e il Client Secret nel pannello Google di Supabase e salva.
  • Se Google risponde redirect_uri_mismatch, confronta i due indirizzi lettera per lettera, poi lascia qualche minuto perché la modifica di Google abbia effetto.
  • Tieni il Client Secret solo in Supabase. Se è mai finito nel codice della tua app, aggiungine uno nuovo su Google e disattiva quello vecchio.

Se le persone superano Google e poi finiscono sulla pagina sbagliata, l'articolo sui reindirizzamenti riparte da lì. La checklist di sicurezza in 10 minuti copre cos'altro guardare prima del lancio.

FAQ

Perché l'accesso con Google apre una pagina di JSON con validation_failed?

La tua app ha mandato il browser all'indirizzo /auth/v1/authorize del tuo progetto Supabase, e Supabase ha risposto lì invece di passare la persona a Google. La pagina dice {"code":400,"error_code":"validation_failed","msg":"Unsupported provider: provider is not enabled"}. La tua app non riceve mai quella risposta, ed è per questo che la sua console non mostra niente. Attiva Google in Authentication, Sign In / Providers.

Ho attivato Google e l'errore resta. Perché?

Di solito la tua app parla con un progetto Supabase diverso da quello che hai modificato. L'indirizzo della pagina di errore comincia con il riferimento del progetto, le lettere prima di .supabase.co; confrontalo con il riferimento nella barra degli indirizzi della tua dashboard. Se coincidono, leggi la fine del messaggio: "missing OAuth secret" vuol dire che il campo del Client Secret è ancora vuoto.

Cosa va in Authorized redirect URIs per Supabase?

L'URL di callback del tuo progetto, https://<project-ref>.supabase.co/auth/v1/callback, copiato dalla voce Google nella pagina Sign In / Providers. Google rimanda le persone a Supabase, e Supabase le manda alla tua app. Per questo l'indirizzo della tua app va nella lista Redirect URLs di Supabase.

Devo pubblicare la mia app Google o aggiungere utenti di prova?

No, per un accesso che chiede solo nome, indirizzo email e profilo, che è tutto quello che Supabase chiede a Google finché il tuo codice non aggiunge scope. La pagina di Google sul pubblico di un'app dice che gli utenti di un'app così non devono stare nell'elenco degli utenti di prova. Se chiedi di più, come l'accesso a Drive, valgono i limiti di prova.

Uso un dominio personalizzato per Supabase. Quale URL di callback serve a Google?

Tutti e due. La guida di Supabase sui domini personalizzati dice di aggiungere il callback del dominio personalizzato, per esempio https://api.example.com/auth/v1/callback, nella console del provider, oltre al callback supabase.co del progetto.

Scritto da

Vlad Tkachenko

Fondatore di Reeve

Passo le giornate a guardare app costruite con Lovable, Bolt, v0, Cursor e Replit, e la breve lista di errori che vi ricompaiono di continuo.

Altro sull'autore

Da leggere dopo

Tutti gli articoli

Fai il backup del database Supabase prima della prossima modifica

Reeve ne tiene una copia cifrata a intervalli programmati e la ripristina per te se qualcosa va storto.

Vedi i backup Supabase

Controllo esterno automatizzato, non un audit completo. L'assenza di risultati non è una garanzia di sicurezza.