Administra sesiones con identidades externas

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

Sesiones de actualización

Las sesiones de Identity Platform tienen una validez de una hora. Cuando una sesión caduca, tu aplicación debe redireccionar a la página de autenticación. La página de autenticación contiene el token de actualización de Identity Platform. Siempre que la credencial del usuario siga siendo válida, puedes utilizarla para volver a autenticarte sin mostrar ninguna IU.

Si el usuario cambió recientemente su dirección de correo electrónico o contraseña, o realizó alguna otra acción que revocó su token, deberá volver a completar el proceso de autenticación.

Cómo manejar solicitudes que no son AJAX

Las solicitudes que no son AJAX se manejan automáticamente con un redireccionamiento de la aplicación, suponiendo que la página de autenticación está configurada correctamente.

Cómo manejar solicitudes AJAX

Si envías una solicitud AJAX con un token vencido, la solicitud mostrará un código de estado 401: Unauthorized. Implementa una de las siguientes soluciones para manejar esto:

  • Modifica el código de la aplicación para controlar los códigos de estado HTTP 401.
  • Agrega un iframe a tu aplicación para que apunte a la actualización de la sesión.
  • Indícales a tus usuarios que carguen manualmente la actualización de la sesión en una pestaña aparte.

Si recibes un código de estado 302 en lugar de 401 en respuesta a solicitudes AJAX, agrega un encabezado X-Requested-With con un valor de XMLHttpRequest. Esto informa a IAP que la solicitud se origina en JavaScript.

Administra HTTP 401 de manera programática

Administrar de manera programática los códigos de estado HTTP 401 es la manera recomendada de actualizar una sesión AJAX. Para ello, haz lo siguiente:

  1. Actualiza el código de la aplicación para controlar el error.

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

  2. Agrega un controlador que abra una ventana para volver a autenticar al usuario y, luego, ciérralo 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) {
        fetch('/favicon.ico').then(function(response) {
          if (response.status === 401) {
            window.setTimeout(checkSessionRefresh, 500);
          } else {
            iapSessionRefreshWindow.close();
            iapSessionRefreshWindow = null;
          }
        });
      } else {
        iapSessionRefreshWindow = null;
      }
    }

Usa un iframe

Si no puedes administrar HTTP 401 de manera programática, la siguiente mejor solución es agregar un iframe a tu aplicación que apunte a la actualización de la sesión. Por ejemplo:

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

Carga el actualizador de la sesión

Como último recurso, puedes indicar a tus usuarios que carguen manualmente la actualización de la sesión. Agrega indicaciones a tu aplicación o a la documentación que indique a los usuarios que abran la siguiente URL en una pestaña aparte:

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

Cierre de sesión de los usuarios

Para que un usuario salga 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 se ve así:

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

Se redireccionará a los usuarios a la página de acceso después de que salieron de la sesión.

Para que todos los usuarios que actualmente tienen acceso salgan de la cuenta, redirecciónalos a la URL de autenticación con tu clave de API y mode=signout anexados como parámetros. Por ejemplo:

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

Los usuarios permanecerán en la página después de que finalice el cierre de sesión. Considera implementar la devolución de llamada completeSignOut() en el objeto AuthenticationHandler para comentarle al usuario que el cierre de sesión se realizó correctamente.

Alterna entre instancias

En algunos casos, es posible que un usuario desee autenticarse con varias instancias para el mismo recurso de IAP. Por ejemplo, es posible que pertenezcan a varias instancias que otorguen diferentes niveles de acceso y que deseen cambiar a una instancia con menos o más privilegios.

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

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

Qué sigue