Gérer des sessions avec des identités externes

Cet article explique comment gérer des sessions avec Identity-Aware Proxy (IAP) si vous utilisez des identités externes pour l'authentification.

Actualiser des sessions

Les sessions Identity Platform sont valides pendant une heure. Lorsqu'une session arrive à expiration, votre application doit rediriger les utilisateurs vers la page d'authentification. Cette page contient le jeton d'actualisation Identity Platform. Tant que les identifiants de l'utilisateur sont encore valides, vous pouvez les utiliser pour la réauthentification sans afficher d'UI.

Si l'utilisateur a récemment modifié son adresse e-mail ou son mot de passe, ou si une autre action a révoqué son jeton, il doit de nouveau effectuer le flux d'authentification.

Traiter les requêtes non-AJAX

Les requêtes non-AJAX sont traitées automatiquement à l'aide d'une redirection d'application, à condition que la page d'authentification soit correctement configurée.

Traiter les requêtes AJAX

Si vous envoyez une requête AJAX avec un jeton arrivé à expiration, la requête affiche un code d'état 401: Unauthorized. Pour traiter ce code d'état, mettez en œuvre l'une des solutions suivantes :

  • Modifiez le code de votre application de façon qu'elle gère les codes d'état HTTP 401.
  • Ajoutez à votre application un iframe qui pointe vers l'actualisateur de session.
  • Demandez à vos utilisateurs de charger manuellement l'actualisateur de session dans un onglet distinct.

Si vous recevez un code d'état 302 au lieu de 401 en réponse à des requêtes AJAX, ajoutez un en-tête X-Requested-With avec la valeur XMLHttpRequest. Cela indique à IAP que la requête provient de JavaScript.

Gérer de manière automatisée les codes d'état HTTP 401

La gestion automatisée des codes d'état HTTP 401 est la méthode recommandée pour actualiser une session AJAX. Procédez comme suit :

  1. Mettez à jour le code de votre application de façon à traiter l'erreur.

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

  2. Ajoutez un gestionnaire qui ouvre une fenêtre pour réauthentifier l'utilisateur, puis la ferme une fois le processus terminé.

    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) {
        fetch('/favicon.ico').then(function(response) {
          if (response.status === 401) {
            window.setTimeout(checkSessionRefresh, 500);
          } else {
            iapSessionRefreshWindow.close();
            iapSessionRefreshWindow = null;
          }
        });
      } else {
        iapSessionRefreshWindow = null;
      }
    }

Utiliser un iFrame

Si vous ne pouvez pas gérer les codes d'état HTTP 401 de manière automatisée, la meilleure solution consiste à ajouter à votre application un iframe qui pointe vers l'actualisateur de session. Exemple :

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

Charger l'actualisateur de session

En dernier recours, vous pouvez demander à vos utilisateurs de charger manuellement l'actualisateur de session. Dans votre application ou dans sa documentation, indiquez aux utilisateurs qu'ils doivent ouvrir l'URL suivante dans un onglet distinct :

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

Déconnecter des utilisateurs

Pour déconnecter un utilisateur d'une ressource IAP, utilisez le paramètre de requête ?gcp-iap-mode=GCIP_SIGNOUT. Par exemple, dans une application App Engine, l'URL se présente comme suit :

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

Une fois déconnectés, les utilisateurs seront redirigés vers la page de connexion.

Pour déconnecter tous les utilisateurs actuellement connectés, redirigez-les vers votre URL d'authentification, en ajoutant votre clé API et mode=signout comme paramètres. Exemple :

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

Les utilisateurs resteront sur la page une fois la déconnexion terminée. Pensez à mettre en œuvre le rappel completeSignOut() sur l'objet AuthenticationHandler pour indiquer aux utilisateurs qu'ils se sont bien déconnectés.

Changer de locataire

Dans certains cas, un utilisateur peut vouloir s'authentifier auprès de plusieurs locataires pour la même ressource IAP. Par exemple, ils peuvent appartenir à plusieurs locataires qui accordent différents niveaux d'accès, et souhaitent passer à un locataire disposant de droits plus ou moins importants.

Pour forcer le redémarrage du processus de sélection du locataire, utilisez ?gcp-iap-mode=CLEAR_LOGIN_COOKIE. Par exemple, dans une application App Engine, l'URL peut se présenter comme suit :

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

Étape suivante