Gestionar sesiones con identidades externas

En este artículo se explica cómo gestionar sesiones con Identity-Aware Proxy (IAP) si usas identidades externas para la autenticación.

Actualizar sesiones

Las sesiones de Identity Platform son válidas durante una hora. Cuando caduca una sesión, tu aplicación debe redirigir a la página de autenticación. La página de autenticación contiene el token de actualización de Identity Platform. Siempre que las credenciales del usuario sigan siendo válidas, puedes usarlas para volver a autenticarlo sin mostrar ninguna interfaz de usuario.

Si el usuario ha cambiado recientemente su correo o contraseña, o se ha producido alguna otra acción que haya revocado su token, deberá completar el flujo de autenticación de nuevo.

Gestionar solicitudes que no son AJAX

Las solicitudes que no son AJAX se gestionan automáticamente mediante una redirección de la aplicación, siempre que la página de autenticación esté configurada correctamente.

Gestionar solicitudes AJAX

Chrome y otros navegadores están eliminando gradualmente las cookies de terceros. Las recomendaciones para hacer solicitudes AJAX de esta página no funcionarán si las cookies de terceros están inhabilitadas. Sin embargo, las recomendaciones proporcionadas seguirán funcionando si tanto la fuente como el destino de las solicitudes AJAX son del mismo sitio.

Para obtener instrucciones sobre cómo gestionar las cookies de terceros en Chrome, consulta el artículo Eliminar, permitir y gestionar cookies en Chrome.

Si envías una solicitud AJAX con un token caducado, la solicitud devolverá un código de estado 401: Unauthorized. Implementa una de las siguientes soluciones para gestionar este problema:

  • Modifica el código de tu aplicación para gestionar los códigos de estado 401 HTTP.
  • Añade un iframe a tu aplicación para que apunte al actualizador de sesiones.
  • Indica a los usuarios que carguen manualmente el actualizador de sesiones en otra pestaña.

Si recibes el código de estado 302 en lugar de 401 en respuesta a solicitudes AJAX, añade un encabezado X-Requested-With con el valor XMLHttpRequest. De esta forma, se informa a las compras en la aplicación de que la solicitud procede de JavaScript.

Gestionar de forma programática el error HTTP 401

La forma recomendada de actualizar una sesión AJAX es gestionar de forma programática los códigos de estado HTTP 401. Para hacer esto:

  1. Actualiza el código de tu aplicación para gestionar el error.

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

  2. Añade un controlador que abra una ventana para volver a autenticar al usuario y, a continuación, la cierre cuando se complete el proceso.

    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;
      }
    }

Usar un iframe

Si no puedes gestionar HTTP 401 de forma programática, la siguiente mejor solución es añadir un iframe a tu aplicación que apunte al actualizador de sesiones.

Para usar un iframe, debes configurar una página de inicio de sesión personalizada en el mismo dominio que la aplicación web protegida por IAP. De lo contrario, los usuarios se encontrarán con errores de origen cruzado. Para obtener más información sobre la configuración de la página de inicio de sesión, consulta el artículo sobre cómo crear una página de inicio de sesión personalizada.

Ejemplo de uso de un iframe:

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

Cargando el actualizador de la sesión

Como último recurso, puedes indicar a tus usuarios que carguen manualmente el actualizador de sesiones. Añade a tu aplicación o a su documentación instrucciones para que los usuarios abran la siguiente URL en una pestaña independiente:

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

Cerrar la sesión de los usuarios

Para cerrar la sesión de un usuario de un recurso de IAP, usa el parámetro de consulta ?gcp-iap-mode=GCIP_SIGNOUT. Por ejemplo, en una aplicación de App Engine, la URL tiene este aspecto:

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

Se redirigirá a los usuarios a la página de inicio de sesión después de cerrar sesión.

Para cerrar la sesión de un usuario en todos los recursos y sesiones, redirígelo a tu URL de autenticación con tu clave de API y mode=signout añadidos como parámetros. Por ejemplo:

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

Los usuarios permanecerán en la página una vez que se haya cerrado la sesión. Implementa la retrollamada completeSignOut() en el objeto AuthenticationHandler para informar al usuario de que ha cerrado sesión correctamente.

Cambiar de un arrendatario a otro

En algunos casos, es posible que un usuario quiera autenticarse con varios arrendatarios para acceder al mismo recurso de IAP. Por ejemplo, pueden pertenecer a varios inquilinos que concedan diferentes niveles de acceso y quieran cambiar a un inquilino con menos o más privilegios.

Para forzar el reinicio del proceso de selección del arrendatario, usa ?gcp-iap-mode=CLEAR_LOGIN_COOKIE. Por ejemplo, en una aplicación de App Engine, la URL podría tener este aspecto:

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

Siguientes pasos