Per utilizzare le identità esterne con Identity-Aware Proxy (IAP), la tua app deve avere una pagina di accesso. IAP reindirizzerà gli utenti a questo per eseguire l'autenticazione prima di poter accedere a risorse sicure.
Questo documento mostra come eseguire il deployment e personalizzare una pagina di accesso predefinita utilizzando Cloud Run. Questo è il modo più rapido per iniziare a utilizzare le identità esterne e non richiede la scrittura di codice.
Puoi creare una pagina di accesso anche tu. Creare una pagina personalizzata è più difficile, ma aumenta il tuo controllo sul flusso di autenticazione e sull'esperienza utente. Consulta Creazione di una pagina di accesso con FirebaseUI e Creazione di una pagina di accesso personalizzata per saperne di più.
Limitazioni della pagina di accesso
Non puoi utilizzare la pagina di accesso predefinita se nel tuo progetto sia abilitata la protezione dall'enumerazione delle email.
Se per il tuo progetto è attiva la protezione dall'enumerazione delle email, disattivala prima di continuare con le procedure in questo documento.
Prima di iniziare
Abilitare l'API Compute Engine.
Abilita le identità esterne e seleziona l'opzione Crea una pagina di accesso per me durante la configurazione. Ciò consente Cloud Run e FirebaseUI creano una pagina di accesso per te.
Assicurati che l'account di servizio utilizzato da Cloud Run, PROJECT_NUMBER-compute@developer.gserviceaccount.com, abbia i seguenti ruoli predefiniti:
roles/identitytoolkit.viewer
roles/iap.settingsAdmin
roles/compute.networkViewer
Impostazione dell'URI di reindirizzamento autorizzato per i provider di Identity Platform
Se utilizzi provider Identity Platform che richiedono il reindirizzamento all'accesso (riindirizzamento alla pagina di accesso dell'IdP esterno). Devi aggiungere l'URL della pagina di accesso ospitata come URL di reindirizzamento autorizzato nella configurazione del provider.
Ad esempio, per un fornitore Google, devi eseguire le seguenti operazioni:
Copia l'URL di accesso dopo aver selezionato l'applicazione protetta da IAP.
Nella console Google Cloud, vai alla pagina Credenziali.
Aggiungi
LOGIN_URL/__/auth/handler
come uno degli URI di reindirizzamento autorizzati per il client OAuth 2.0 della tua app. Seleziona lo stesso ID client OAuth che hai utilizzato durante la configurazione del provider Google.
Per gli altri provider SAML e OIDC, aggiungi LOGIN_URL/__/auth/handler
come URI di reindirizzamento autorizzato o URL ACS.
Test della pagina di accesso
La pagina di accesso iniziale creata da IAP è completamente funzionale. Per testarlo:
Accedi a una risorsa protetta da IAP. Dovresti automaticamente alla pagina di accesso.
Seleziona un tenant e un provider con cui accedere. Se non vedi tenant o i fornitori elencati, assicurati di averne configurato uno utilizzando Identity Platform.
Accedi con le tue credenziali.
Dovresti essere reindirizzato alla risorsa protetta.
Personalizzazione della pagina di accesso
Puoi personalizzare la pagina di accesso utilizzando un file di configurazione JSON. Ecco alcune opzioni:
- Aggiunta di un'intestazione e di un logo alla pagina di accesso.
- Specifica i tenant e i provider disponibili.
- Personalizzazione delle icone e dello stile di ciascun pulsante tenant e provider.
- Aggiunta di link alle norme sulla privacy e ai Termini di servizio dell'app.
Le sezioni seguenti spiegano come accedere e aggiornare il file di configurazione JSON.
Ottenere un token di accesso
Per amministrare la pagina di accesso, devi disporre di un token di accesso Google. La il modo più semplice per ottenerne uno è abilitare Google come provider e Identity Platform. Se la tua app utilizza già Google come provider di identità, puoi saltare questa sezione.
Vai alla pagina Identity Platform Providers nella nella console Google Cloud.
Fai clic su Aggiungi un fornitore.
Seleziona Google dall'elenco dei provider.
Configura Web Client ID (ID client web) e Web Client Secret:
Nella console Google Cloud, vai alla pagina Credenziali.
Utilizza un client OAuth 2.0 esistente o creane uno nuovo. Configura
Client ID
eClient secret
in Web Client ID (ID client web) e Web client secret. AggiungiLOGIN_URL/__/auth/handler
come uno degli URI di reindirizzamento autorizzati per il client OAuth 2.0.LOGIN_URL
è l'URL di accesso creato da IAP dopo aver selezionato l'opzione Crea una pagina di accesso per me. Puoi trovarlo nella pagina IAP della console Google Cloud, selezionando la risorsa protetta da IAP.
Fai clic su Salva in entrambe le pagine.
Accesso al pannello di amministrazione
La configurazione JSON per la pagina di accesso ospitata da Cloud Run nel riquadro LOGIN_URL/admin
.
I passaggi seguenti mostrano come accedere al riquadro. Tieni presente che avrai bisogno della
Ruolo Amministratore Storage (roles/storage.admin
).
Vai alla pagina IAP nella console Google Cloud.
Seleziona la risorsa dall'elenco.
Avvia l'URL elencato in Personalizza pagina nel riquadro delle informazioni. Dovrebbe simile a
https://servicename-xyz-uc.a.run.app/admin
.Accedi con lo stesso Account Google usato per la configurazione IAP. Un editor di testo contenente la configurazione JSON .
Modifica della configurazione
Lo schema di configurazione della pagina di accesso si basa su
FirebaseUI,
e ne eredita molte proprietà. Anziché utilizzare LOGIN_URL
creato dall'IAP come authDomain predefinito, puoi utilizzare PROJECT_ID.firebaseapp.com
.
Se vuoi utilizzare PROJECT_ID.firebaseapp.com
come authDomain
,
modifica signInFlow
come popup
per evitare problemi di accesso allo spazio di archiviazione di terze parti nei principali browser(consulta Best practice per l'utilizzo di signInWithRedirect sui browser che bloccano l'accesso allo spazio di archiviazione di terze parti). Inoltre, segui le istruzioni riportate in Impostazione dell'URI di reindirizzamento autorizzato per i provider di Identity Platform per aggiungere PROJECT_ID.firebaseapp.com/__/auth/handler
come uno degli URI di reindirizzamento autorizzati o degli URL ACS per il provider Identity Platform con cui gli utenti accederanno.
Il seguente codice mostra un esempio configurazione con tre tenant:
{
"AIzaSyC5DtmRUR...": {
"authDomain": "awesomeco.firebaseapp.com",
"displayMode": "optionFirst",
"selectTenantUiTitle": "Awesome Company Portal",
"selectTenantUiLogo": "https://awesome.com/abcd/logo.png",
"styleUrl": "https://awesome.com/abcd/overrides/stylesheet.css",
"tosUrl": "https://awesome.com/abcd/tos.html",
"privacyPolicyUrl": "https://awesome.com/abcd/privacypolicy.html",
"tenants": {
"tenant-a-id": {
"fullLabel": "Company A Portal",
"displayName": "Company A",
"iconUrl": "https://companya.com/img/icon.png",
"logoUrl": "https://companya.com/img/logo.png",
"buttonColor": "#007bff",
"signInFlow": "popup",
"signInOptions": [
{
"provider": "password",
"requireDisplayName": false,
"disableSignUp": {
"status": true,
"adminEmail": "admin@example.com",
"helpLink": "https://www.example.com/trouble_signing_in"
}
},
"facebook.com",
"google.com",
"microsoft.com",
{
"provider": "saml.okta-cicp-app",
"providerName": "Corp Account",
"fullLabel": "Employee Corporate Login",
"buttonColor": "#ff0000",
"iconUrl": "https://companya.com/abcd/icon-1.png"
},
{
"provider": "oidc.okta-oidc",
"providerName": "Contractor Account",
"fullLabel": "Contractor Account Portal",
"buttonColor": "#00ff00",
"iconUrl": "https://companya.com/abcd/icon-2.png"
}
],
"tosUrl": "https://companya.com/abcd/tos.html",
"privacyPolicyUrl": "https://companya.com/abcd/privacypolicy.html"
},
"tenant-b-id": {
"fullLabel": "Company B Portal",
"displayName": "Company B",
"iconUrl": "https://companyb.com/img/icon.png",
"logoUrl": "https://companyb.com/img/logo.png",
"buttonColor": "#007bff",
"immediateFederatedRedirect": true,
"signInFlow": "popup",
"signInOptions": [
{
"provider": "saml.okta-bla-app",
"providerName": "Corp Account",
"buttonColor": "#0000ff",
"iconUrl": "https://companyb.com/abcd/icon.png"
}
],
"tosUrl": "https://companyb.com/abcd/tos.html",
"privacyPolicyUrl": "https://companyb.com/abcd/privacypolicy.html"
},
"tenant-c-id": {
"fullLabel": "Company C Portal",
"displayName": "Company C",
"iconUrl": "https://companyc.com/img/icon.png",
"logoUrl": "https://companyc.com/img/logo.png",
"buttonColor": "#007bff",
"immediateFederatedRedirect": true,
"signInFlow": "popup",
"signInOptions": [
{
"provider": "password",
"requireDisplayName": false
},
{
"provider": "google.com",
"scopes": ["scope1", "scope2", "https://example.com/scope3"],
"loginHintKey": "login_hint",
"customParameters": {
"prompt": "consent",
},
}
],
"tosUrl": "https://companyc.com/abcd/tos.html",
"privacyPolicyUrl": "https://companyc.com/abcd/privacypolicy.html",
"adminRestrictedOperation": {
"status": true,
"adminEmail": "admin@example.com",
"helpLink": "https://www.example.com/trouble_signing_in"
}
},
}
}
}
Per un elenco completo delle proprietà disponibili, consulta la documentazione di riferimento.
Sostituzione del CSS
Puoi utilizzare la proprietà styleUrl
per specificare un file CSS personalizzato. Stili in
questo file sostituirà il CSS predefinito. Il file deve essere accessibile pubblicamente
tramite HTTPS (ad esempio ospitato in un bucket Cloud Storage).
L'esempio seguente mostra la sostituzione del CSS predefinito:
/** Change header title style. */
.heading-center {
color: #7181a5;
font-family: Arial, Helvetica, sans-serif;
font-size: 20px;
font-weight: bold;
}
/** Use round edged borders for container. */
.main-container {
border-radius: 5px;
}
/** Change page background color. */
body {
background-color: #f8f9fa;
}
Nuovo deployment dell'istanza Cloud Run
In alcuni casi, potresti voler eseguire nuovamente il deployment dell'istanza Cloud Run che ospita la pagina di accesso. Ecco alcuni scenari di esempio:
- Aggiungere, modificare o rimuovere fornitori di identità
- Modifica delle configurazioni del tenant
- Imposta le variabili di ambiente
- Aggiornamento dell'immagine container alla versione più recente
L'aggiornamento e il ricoinvolgimento regolari dell'immagine container ti assicurano di disporre delle ultime correzioni di bug e patch di sicurezza. Puoi visualizzare l'elenco delle modifiche tra le versioni GitHub.
Puoi ottenere la versione attuale del container di cui è stato eseguito il deployment utilizzando /versionz
endpoint. Ad esempio:
curl 'https://servicename-xyz-uc.a.run.app/versionz'
Per rieseguire il deployment dell'istanza Cloud Run:
Vai alla pagina Cloud Run nella console Google Cloud.
Seleziona l'istanza che ospita la pagina di accesso.
Fai clic su Modifica e Esegui il deployment della nuova revisione.
Se vuoi, specifica le impostazioni avanzate per la revisione o aggiungi una variabile di ambiente facendo clic sulla scheda Variabili e secret.
Fai clic su Esegui il deployment.
Opzioni avanzate
Personalizzazione programmatica della pagina di accesso
Oltre a utilizzare la console /admin
, puoi aggiornare il file JSON
configurazione in modo programmatico.
Per ottenere la configurazione attuale, utilizza l'endpoint /get_admin_config
.
Ad esempio:
curl -H 'Authorization: Bearer [TOKEN]'
'https://servicename-xyz-uc.a.run.app/get_admin_config'
Per aggiornare la configurazione, utilizza /set_admin_config
. Ad esempio:
curl -XPOST -H 'Authorization: Bearer [TOKEN]' -H "Content-type: application/json"
-d '[UPDATED-CONFIG]' 'https://servicename-xyz-uc.a.run.app/set_admin_config'
Entrambe le chiamate REST richiedono l'ambito https://www.googleapis.com/auth/devstorage.read_write
e un token OAuth valido deve essere allegato all'intestazione Authorization
.
Imposta le variabili di ambiente
Puoi impostare le variabili di ambiente nell'istanza Cloud Run per personalizzare le impostazioni avanzate. La tabella seguente elenca le variabili:
Variabile | Descrizione |
---|---|
DEBUG_CONSOLE |
Un valore booleano (0 o 1 ) che indica se vuoi
registrare tutti gli errori e i dettagli delle richieste di rete. I dati sensibili non saranno
registrato. Disattivato (0 ) per impostazione predefinita.
|
UI_CONFIG |
Una stringa contenente la configurazione JSON per la pagina di accesso. Utilizzo
questa variabile anziché il riquadro /admin evita di leggere e
scrivere in Cloud Storage quando si accede alla configurazione. Le configurazioni
non valide vengono ignorate. Utilizzo del riquadro /admin per
convalida il tuo JSON prima di impostare questa variabile può aiutare a ridurre al minimo la sintassi
errori.
|
GCS_BUCKET_NAME |
Una stringa che sostituisce il bucket Cloud Storage predefinito utilizzato per l'archiviazione
la configurazione JSON. Il file è denominato config.json e
la località predefinita è
gcip-iap-bucket-[CLOUD-RUN-SERVICE-NAME]-[PROJECT-NUMBER] .
|
ALLOW_ADMIN |
Un valore booleano (0 o 1 ) che indica se vuoi
consentire l'accesso al riquadro di configurazione di /admin .
Abilitata (1 ) per impostazione predefinita.
|
Dovrai eseguire il deployment di una nuova revisione dell'istanza Cloud Run dopo aver aggiornato le variabili prima dell'applicazione delle modifiche. Per scoprire di più su le variabili di ambiente, consulta Documentazione di Cloud Run.
Personalizzazione del dominio
Per impostazione predefinita, gli utenti vedranno l'URL dell'istanza Cloud Run quando accedono. Per specificare un dominio personalizzato:
Segui i passaggi descritti in Mappatura di domini personalizzati per impostare un dominio personalizzato per l'istanza Cloud Run.
Configura IAP per utilizzare il nuovo URL di autenticazione:
Vai alla pagina IAP nella console Google Cloud.
Seleziona la risorsa protetta da IAP.
Nel riquadro laterale, seleziona l'icona Modifica accanto al campo URL di accesso.
Seleziona Utilizza una pagina di accesso ospitata esistente e scegli il tuo dominio. nel menu a discesa.
Fai clic su Salva.
Utilizzo di un'unica pagina di accesso per più risorse IAP
Puoi proteggere più risorse IAP utilizzando lo stesso accesso . Questo riduce il lavoro associato alla gestione di più configurazioni.
Per riutilizzare una pagina di accesso:
Segui i passaggi riportati in questo articolo per eseguire il deployment della pagina di autenticazione per la prima risorsa protetta da IAP.
Abilita IAP per la seconda risorsa. Quando viene richiesto di specifica una pagina di accesso, seleziona Fornirò il mio e inserisci il URL del servizio Cloud Run come URL.
Esegui di nuovo il deployment del servizio Cloud Run.
Risoluzione dei problemi
Cookie di terze parti e partizionamento dello spazio di archiviazione nei browser
Per i browser che disattivano i cookie di terze parti o implementano il partizionamento dello spazio di archiviazione, la pagina di accesso o la pagina di amministrazione potrebbe non funzionare correttamente. Per risolvere il problema:
Esegui nuovamente il deployment della pagina di accesso per utilizzare la versione 1.0.1 più recente.
Se utilizzi la funzionalità Personalizzazione della pagina di accesso, assicurati che
authDomain
sia impostato comeLOGIN_URL
creato da IAP. In alternativa, puoi impostareauthDomain
comePROJECT_ID.firebaseapp.com
sesignInFlow
è impostato comepopup
.{ "AIzaSyC5DtmRUR...": { "authDomain": "LOGIN_URL", ... } }
o
{ "AIzaSyC5DtmRUR...": { "authDomain": "PROJECT_ID.firebaseapp.com", "tenants": { "tenant-a-id": { ... "signInFlow": "popup" ... } } ... } }
Passaggi successivi
- Crea una UI di autenticazione con FirebaseUI.
- Crea un'interfaccia utente di autenticazione personalizzata.
- Comprendi meglio come funzionano le identità esterne con IAP.