Accesso degli utenti con OIDC
Questo documento mostra come utilizzare Identity Platform per consentire agli utenti di accedere con un provider OpenID Connect (OIDC).
Prima di iniziare
- Accedi al tuo Google Cloud account. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
- Attiva Identity Platform e aggiungi l'SDK client alla tua app. Per scoprire come fare, consulta la guida rapida.
Configurazione del provider
Vai alla pagina Provider di identità nella Google Cloud console.
Vai alla pagina Provider di identitàFai clic su Aggiungi un provider e seleziona OpenID Connect dall'elenco.
Flusso del codice di autorizzazione
Inserisci i seguenti dettagli per attivare il flusso del codice di autorizzazione:
Seleziona Flusso del codice nella sezione Scegli il tipo di autorizzazione.
Il nome del provider. Può essere uguale all'ID provider o un nome personalizzato. Se inserisci un nome personalizzato, fai clic su Modifica accanto a ID provider per specificare l'ID (che deve iniziare con
oidc.).L'ID client del provider.
L'emittente del provider. Dovrebbe essere simile a
https://example.com. Identity Platform utilizza questo URL per individuare il documento di rilevamento OIDC (in genere si trova in/.well-known/openid-configuration), che specifica gli endpoint OAuth e le chiavi pubbliche del provider.Il client secret del provider.
Aggiungi la tua app all'elenco dei domini autorizzati. Ad esempio, se l' URL di accesso della tua app è
https://example.com/login, aggiungiexample.com.Configura l'URL di callback di Identity Platform come URL di reindirizzamento con il tuo provider OIDC. L'URL dovrebbe essere simile a
https://[PROJECT-ID].firebaseapp.com/__/auth/handler.Fai clic su Salva.
Flusso implicito
Inserisci i seguenti dettagli per attivare il flusso implicito:
Seleziona Flusso implicito nella sezione Scegli il tipo di autorizzazione.
Il nome del provider. Può essere uguale all'ID provider o un nome personalizzato. Se inserisci un nome personalizzato, fai clic su Modifica accanto a ID provider per specificare l'ID (che deve iniziare con
oidc.).L'ID client del provider.
L'emittente del provider. Dovrebbe essere simile a
https://example.com.Identity Platform utilizza questo URL per individuare il documento di rilevamento OIDC (in genere si trova in/.well-known/openid-configuration), che specifica gli endpoint OAuth e le chiavi pubbliche del provider.
Aggiungi la tua app all'elenco dei domini autorizzati. Ad esempio, se l' URL di accesso della tua app è
https://example.com/login, aggiungiexample.com.Configura l'URL di callback di Identity Platform come URL di reindirizzamento con il tuo provider OIDC. L'URL dovrebbe essere simile a
https://[PROJECT-ID].firebaseapp.com/__/auth/handler.Fai clic su Salva.
Accesso degli utenti
Esistono due modi per consentire agli utenti di accedere con OIDC:
Utilizzando il flusso OAuth. In questo modo, l'handshake OAuth viene completato automaticamente. In base alla selezione del flusso del codice di autorizzazione/flusso implicito nel passaggio di configurazione del provider, il server GCIP sceglie il flusso desiderato per comunicare con il provider di identità.
Utilizzando il token ID del provider OIDC. In questo modo, si presuppone che tu abbia già un token OIDC disponibile.
Accesso degli utenti con OAuth
Per accedere utilizzando OAuth:
Crea un'
OAuthProvideristanza con l'ID provider che hai configurato in la sezione precedente. L'ID provider deve iniziare conoidc..Versione web 9
import { OAuthProvider } from "firebase/auth"; const provider = new OAuthProvider("oidc.myProvider");
Versione web 8
const provider = new firebase.auth.OAuthProvider('oidc.myProvider');
Avvia il flusso di accesso. Puoi scegliere di utilizzare un popup o un reindirizzamento.
Popup
Versione web 9
import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth"; const auth = getAuth(); signInWithPopup(auth, provider) .then((result) => { // User is signed in. const credential = OAuthProvider.credentialFromResult(result); // This gives you an access token for the OIDC provider. You can use it to directly interact with that provider }).catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; // The email of the user's account used. const email = error.customData.email; // The AuthCredential type that was used. const credential = OAuthProvider.credentialFromError(error); // Handle / display error. // ... });
Versione web 8
firebase.auth().signInWithPopup(provider) .then((result) => { // User is signed in. // result.credential is a firebase.auth().OAuthCredential object. // result.credential.providerId is equal to 'oidc.myProvider'. // result.credential.idToken is the OIDC provider's ID token. }) .catch((error) => { // Handle error. });
Reindirizzamento
Per reindirizzare a una pagina di accesso, chiama
signInWithRedirect():Versione web 9
import { getAuth, signInWithRedirect } from "firebase/auth"; const auth = getAuth(); signInWithRedirect(auth, provider);
Versione web 8
firebase.auth().signInWithRedirect(provider).catch((error) => { // Handle error. });
Poi, chiama
getRedirectResult()per ottenere i risultati quando l'utente torna alla tua app:Versione web 9
import { getAuth, getRedirectResult, OAuthProvider } from "firebase/auth"; const auth = getAuth(); getRedirectResult(auth) .then((result) => { // User is signed in. const credential = OAuthProvider.credentialFromResult(result); // This gives you an access token for the OIDC provider. You can use it to directly interact with that provider }) .catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; // The email of the user's account used. const email = error.customData.email; // The AuthCredential type that was used. const credential = OAuthProvider.credentialFromError(error); // Handle / display error. // ... });
Versione web 8
// On return. firebase.auth().getRedirectResult() .then((result) => { // User is signed in. // result.credential is a firebase.auth().OAuthCredential object. // result.credential.providerId is equal to 'oidc.myProvider'. // result.credential.idToken is the OIDC provider's ID token. }) .catch((error) => { // Handle / display error. // ... });
Al termine di uno dei due flussi, puoi ottenere il token ID OIDC utilizzando il campo result.credential.idToken.
Accesso diretto degli utenti
Per consentire l'accesso diretto di un utente con un token ID OIDC:
Inizializza un'istanza
OAuthProvidercon l'ID provider che hai configurato nella sezione precedente. L'ID provider deve iniziare conoidc.. Poi, crea unOAuthCredentiale chiamasignInWithCredential()per consentire l'accesso all'utente.Versione web 9
import { getAuth, OAuthProvider, signInWithCredential } from "firebase/auth"; const auth = getAuth(); const credential = provider.credential({ idToken: oidcIdToken, }); signInWithCredential(auth, credential) .then((result) => { // User is signed in. const newCredential = OAuthProvider.credentialFromResult(result); // This gives you a new access token for the OIDC provider. You can use it to directly interact with that provider. }) .catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; // The email of the user's account used. const email = error.customData.email; // The AuthCredential type that was used. const credential = OAuthProvider.credentialFromError(error); // Handle / display error. // ... });
Versione web 8
const credential = provider.credential(oidcIdToken, null); firebase.auth().signInWithCredential(credential) .then((result) => { // User is signed in. // User now has a odic.myProvider UserInfo in providerData. }) .catch((error) => { // Handle / display error. // ... });
Collegamento degli account utente
Se un utente ha già eseguito l'accesso alla tua app utilizzando un metodo diverso (ad esempio email/password), puoi collegare il suo account esistente al provider OIDC utilizzando linkWithPopup() o linkWithRedirect():
Ad esempio, possiamo collegare un Account Google:
Versione web 9
import { getAuth, linkWithPopup, GoogleAuthProvider } from "firebase/auth"; const provider = new GoogleAuthProvider(); const auth = getAuth(); linkWithPopup(auth.currentUser, provider).then((result) => { // Accounts successfully linked. const credential = GoogleAuthProvider.credentialFromResult(result); const user = result.user; // ... }).catch((error) => { // Handle Errors here. // ... });
Versione web 8
auth.currentUser.linkWithPopup(provider).then((result) => { // Accounts successfully linked. var credential = result.credential; var user = result.user; // ... }).catch((error) => { // Handle Errors here. // ... });
Passaggi successivi
- Accesso degli utenti con SAML
- Visualizzazione di un dominio personalizzato durante l'accesso
- Gestione programmatica dei provider OIDC e SAML