Gestione delle sessioni con identità esterne

Questo articolo spiega come gestire le sessioni con Identity-Aware Proxy (IAP) se utilizzi identità esterne per l'autenticazione.

Aggiornamento delle sessioni

Le sessioni di Identity Platform sono valide per un'ora. Quando una sessione scade, la tua app deve reindirizzare alla pagina di autenticazione. La pagina di autenticazione contiene il token di aggiornamento di Identity Platform. Finché le credenziali dell'utente sono ancora valide, puoi utilizzarle per la riautenticazione senza mostrare alcuna UI.

Se l'utente ha cambiato di recente la sua email o la sua password o si è verificata un'altra azione che ha revocato il suo token, dovrà completare di nuovo il flusso di autenticazione.

Gestione delle richieste non AJAX

Le richieste non AJAX vengono gestite automaticamente utilizzando un reindirizzamento dell'applicazione, supponendo che la pagina di autenticazione sia configurata correttamente.

Gestione delle richieste AJAX

Chrome e altri browser stanno ritirando gradualmente i cookie di terze parti. I consigli per effettuare richieste AJAX in questa pagina non funzioneranno se i cookie di terze parti sono disattivati. Tuttavia, i suggerimenti forniti rimarranno funzionali se sia l'origine che la destinazione delle richieste AJAX provengono dallo stesso sito.

Per istruzioni sulla gestione dei cookie di terze parti in Chrome, vedi Eliminare, consentire e gestire i cookie in Chrome.

Se invii una richiesta AJAX con un token scaduto, la richiesta restituirà un codice di stato 401: Unauthorized. Implementa una delle seguenti soluzioni per gestire questo problema:

  • Modifica il codice dell'applicazione per gestire i codici di stato HTTP 401.
  • Aggiungi un iframe alla tua applicazione per indirizzare al session refresher.
  • Chiedi agli utenti di caricare manualmente l'aggiornamento della sessione in una scheda separata.

Se ricevi un codice di stato 302 anziché 401 in risposta alle richieste AJAX, aggiungi un'intestazione X-Requested-With con un valore XMLHttpRequest. In questo modo, IAP viene informato che la richiesta ha origine da JavaScript.

Gestione programmatica di HTTP 401

La gestione programmatica dei codici di stato HTTP 401 è il modo consigliato per aggiornare una sessione AJAX. Per farlo:

  1. Aggiorna il codice dell'applicazione per gestire l'errore.

    if (response.status === 401) {
      statusElm.innerHTML = 'Login stale. <input type="button" value="Refresh" onclick="sessionRefreshClicked();"/>';
    }

  2. Aggiungi un gestore che apre una finestra per riautenticare l'utente, quindi la chiude al termine della procedura.

    var iapSessionRefreshWindow = null;
    
    function sessionRefreshClicked() {
      if (iapSessionRefreshWindow == null) {
        iapSessionRefreshWindow = window.open("/?gcp-iap-mode=DO_SESSION_REFRESH");
        window.setTimeout(checkSessionRefresh, 500);
      }
      return false;
    }
    
    function checkSessionRefresh() {
      if (iapSessionRefreshWindow != null && !iapSessionRefreshWindow.closed) {
        // Attempting to start a new session.
        // XMLHttpRequests is used by the server to identify AJAX requests
        fetch('/favicon.ico', {
              method: "GET",
              credentials: 'include',
              headers: {
                  'X-Requested-With': 'XMLHttpRequest'
              }
        .then((response) => {
          // Checking if browser has a session for the requested app
          if (response.status === 401) {
            // No new session detected. Try to get a session again
            window.setTimeout(checkSessionRefresh, 500);
          } else {
            // Session retrieved.
            iapSessionRefreshWindow.close();
            iapSessionRefreshWindow = null;
          }
        })
        });
      } else {
        iapSessionRefreshWindow = null;
      }
    }

Utilizzo di un iframe

Se non riesci a gestire HTTP 401 a livello di programmazione, la soluzione migliore è aggiungere un iframe all'applicazione che rimandi all'aggiornamento della sessione.

L'utilizzo di un iframe richiede la configurazione di una pagina di accesso personalizzata sullo stesso dominio dell'app web protetta da IAP. In caso contrario, gli utenti riscontreranno errori di origine diversa. Per saperne di più sulla configurazione della pagina di accesso, vedi Creazione di una pagina di accesso personalizzata.

Esempio di utilizzo di un iframe:

<iframe src="https://example.com/some/path?gcp-iap-mode=SESSION_REFRESHER" style="width:0;height:0;border:0; border:none;"></iframe>

Caricamento dell'aggiornamento della sessione in corso…

Come ultima risorsa, puoi chiedere agli utenti di caricare manualmente l'aggiornamento della sessione. Aggiungi indicazioni alla tua applicazione o alla relativa documentazione che invitino gli utenti ad aprire il seguente URL in una scheda separata:

https://example.com/some/path?gcp-iap-mode=SESSION_REFRESHER

Disconnessione degli utenti

Per disconnettere un utente da una risorsa IAP, utilizza il parametro di query ?gcp-iap-mode=GCIP_SIGNOUT. Ad esempio, in un'app App Engine, l'URL ha questo aspetto:

https://example.com/some/path?gcp-iap-mode=GCIP_SIGNOUT

Gli utenti verranno reindirizzati alla pagina di accesso dopo la disconnessione.

Per disconnettere un utente da tutte le risorse e le sessioni, reindirizzalo all'URL di autenticazione con la chiave API e mode=signout aggiunti come parametri. Ad esempio:

https://auth.example.com/?apiKey=API-KEY&mode=signout

Gli utenti rimarranno sulla pagina al termine della disconnessione. Valuta la possibilità di implementare il callback completeSignOut() sull'oggetto AuthenticationHandler per fornire all'utente un feedback che indichi che ha eseguito la disconnessione correttamente.

Passare da un tenant all'altro

In alcuni casi, un utente potrebbe voler eseguire l'autenticazione con più tenant per la stessa risorsa IAP. Ad esempio, potrebbero appartenere a più tenant che concedono diversi livelli di accesso e vogliono passare a un tenant con privilegi inferiori o superiori.

Per forzare il riavvio della procedura di selezione del tenant, utilizza ?gcp-iap-mode=CLEAR_LOGIN_COOKIE. Ad esempio, in un'app App Engine, l'URL potrebbe avere il seguente aspetto:

https://PROJECT-ID.appspot.com/some/path?gcp-iap-mode=CLEAR_LOGIN_COOKIE

Passaggi successivi