Invocación del punto final de gestión de sesiones para OpenID Connect

El punto final de gestión de sesiones permite a las partes dependiente de OpenID Connect supervisar el estado de inicio de sesión de un usuario con un determinado proveedor de OpenID Connect (OP) mientras se minimiza el tráfico de red. Con la ayuda del punto final de gestión de sesiones, una Relying Party (RP) puede finalizar la sesión de un usuario que ha finalizado la sesión del proveedor de OpenID Connect.

Antes de empezar

El URL de punto final de gestión de sesiones de OP se obtiene del atributo check_session_iframe en la información de descubrimiento que se devuelve del punto final del descubrimiento del OP. Este URL debe utilizarse como el destino de un iframe en la aplicación RP que requiere la funcionalidad de gestión de sesiones. La aplicación RP también debe conocer el atributo id de iframe para poder enviarle solicitudes Window.postMessage().

Acerca de esta tarea

Para determinar el estado de inicio de sesión de un usuario, la RP carga un iframe con su destino src establecido en el punto final de gestión de sesiones del OP. El punto final de gestión de sesiones tiene acceso a una cookie que almacena el estado de inicio de sesión, o estado del navegador, de un usuario. Esta cookie de estado del navegador se actualiza cuando un usuario finaliza la sesión del OP. A continuación, la RP puede utilizar los scripts del lado del cliente para invocar la función Window.postMessage() del iframe del OP, enviando el ID de cliente y el estado de sesión conocido actualmente en el texto del mensaje. Si la RP recibe un postMessage de la trama del OP con un valor changed, el estado de inicio de sesión del usuario en el OP ha cambiado y la RP puede decidir si desea finalizar sesión del usuario. Si se devuelve un valor unchanged, la sesión del usuario continúa iniciada en el OP.

Un servidor de Liberty con OpenID Connect habilitado tiene acceso al punto final de gestión de sesiones de OpenID Connect en el siguiente URL:

https://server.example.com:443/oidc/endpoint/<provider_name>/check_session_iframe
Evite problemas: Si está utilizando un proxy de salida, tenga en cuenta que la RP de OpenID Connect no proporciona un medio de direccionar las solicitudes a través de un host de proxy de forma automática.

Si tiene que utilizar un proxy para acceder al proveedor de OpenID Connect (OP), el valor que especifique en cualquier propiedad de URL relacionada con OP tiene que contener el host de proxy y el puerto, no el host y el puerto externos de OP.

En la mayoría de los casos, se puede sustituir el host y el puerto de OP con el host y el puerto del proxy. El URL que especifique tiene que ser visible a la RP y al cliente (navegador o aplicación). Para obtener pautas adicionales sobre cómo determinar el URL que hay que usar, póngase en contacto con el administrador del proxy.

En este ejemplo, el cliente espera que el puerto SSL esté establecido en 443.

Procedimiento

  1. Cree un recurso web en una aplicación RP adecuada que pueda cargar un iframe dirigido al punto final de gestión de sesiones del OP. El recurso web también debe tener acceso al valor de estado de sesión que se devuelve en el parámetro session_state de la respuesta de autorización. Por ejemplo, el valor de estado de la sesión puede almacenarse en una cookie, o de cualquier otra forma que permita a los scripts del lado del cliente en el recurso web saber cuál es el valor. A continuación, se muestra un fragmento HTML de ejemplo para un iframe de este tipo.
    <iframe id="iframeOP" src="https://server.example.com:443/oidc/endpoint/OidcConfigSample/check_session_iframe" frameborder="0" width="0" height="0"></iframe>
  2. Para comprobar el estado de inicio de sesión de un usuario, invoque la función Window.postMessage() del iframe del OP, pasando el ID de cliente y el estado de sesión como parámetro del mensaje en el formato ID cliente + " " + Estado sesión y el nombre de host del OP como parámetro de origen de destino. En la siguiente función de ejemplo JavaScript, el script espera que el valor de estado de la sesión se almacene en una cookie denominada session_state, y la función getCookieValue() devuelve el valor que está almacenado en la cookie session_state.
    	var targetOP = "https://server.example.com:443";
    	function checkStatus() {
               var client = "client01";
               var sessionState = getCookieValue("session_state");
               var text = client + " " + sessionState;
               var iframe = document.getElementById("iframeOP");
               iframe.contentWindow.postMessage(text, targetOP);
    	}
  3. Configure el recurso web para que escuche los postMessages del OP que contienen el valor changed o unchanged para reflejar el estado de inicio de sesión correspondiente del usuario. A continuación, la RP puede decidir si desea finalizar la sesión del usuario de la RP basándose en el valor que se devuelve del OP. La función debe asegurarse de que el origen del postMessage coincida con el nombre de host de OP esperado. Los mensajes que no coinciden se rechazarán. El siguiente ejemplo de JavaScript muestra cómo añadir un escucha de sucesos al recurso web para que escuche este tipo de mensajes.
    	var targetOP = "https://server.example.com:443";
    	window.addEventListener("message", receiveMessage, false);
    	function receiveMessage(event) {
               if (event.origin !== targetOP) {
                         // El origen no provenía del OP; este mensaje debe rechazarse.
                         return;
               }
               if (event.data === "unchanged") {
                         // La sesión del usuario continúa iniciada en el OP
               } else {
                         // El usuario ha finalizado la sesión del OP
               }
    	}

Resultados

Ahora tiene un recurso web en la RP que puede utilizar la funcionalidad de gestión de sesiones de OpenID Connect en un OP de servidor de Liberty. El estado del navegador que se mantiene en el iframe del OP se actualiza cuando los usuarios inician o finalizan una sesión del OP. Después de un inicio de sesión satisfactorio en el OP, se proporciona un valor de estado de sesión nueva en la respuesta de autorización a la RP. A continuación, la RP puede utilizar los scripts del lado del cliente para validar el estado de sesión del usuario, para determinar si el estado de inicio de sesión del usuario ha cambiado en el OP sin difundir tráfico de red adicional.

Ejemplo

El siguiente ejemplo de HTML muestra una página HTML completa que utiliza la gestión de sesiones de OpenID Connect. El atributo src del iframe del OP se establece en el URL del punto final de gestión de sesiones obtenido del OP. La función startChecking() se invoca automáticamente cada 60 segundos y comprueba el estado de inicio de sesión del usuario. La página tiene un escucha de sucesos message que invoca la función receiveMessage() cuando se recibe un postMessage. Esta función comprueba que el postMessage provenga del dominio esperado para el OP y verifica el valor del mensaje devuelto, para ver si el estado de inicio de sesión del usuario es changed o unchanged.

Puede cargar esta página HTML, por sí sola, como un iframe invisible en otro recurso web en la RP. Esto permite que cualquier recurso web que cargue este iframe pueda supervisar el estado de inicio de sesión del usuario en el lado del cliente.
	<!DOCTYPE html>
	<html>
	<head>
	<meta charset="ISO-8859-1">
	<title>iFrame RP Page</title>
	</head>
	<body onload="javascript:startChecking()">
            <iframe id="iframeOP" src="https://localhost:8999/oidc/endpoint/OidcConfigSample/check_session_iframe" frameborder="0" width="0" height="0"></iframe>
	</body>
	<script>
            var targetOP = "https://server.example.com:443";
		
            window.addEventListener("message", receiveMessage, false);
		
            function startChecking() {
                      checkStatus();
                      // Comprobar el estado cada 60 segundos
                      setInterval("checkStatus()", 1000*60);
            }
		
            function getCookieValue(cookieName) {
                      var name = cookieName + "=";
                      var cookies = document.cookie.split(';');
                      if (!cookies) {
                                return null;
                      }
                      for (var i = 0; i < cookies.length; i++) {
                                var cookie = cookies[i].trim();
                                if (cookie.indexOf(name) == 0) {
                                          return cookie.substring(name.length, cookie.length);
                                }
                      }
                      return null;
            }
		
            function checkStatus() {
                      var client = "client01";
                      var sessionState = getCookieValue("session_state");
                      var text = client + " " + sessionState;
                      var iframe = document.getElementById("iframeOP");
                      iframe.contentWindow.postMessage(text, targetOP);
            }
		
            function receiveMessage(event) {
                      if (event.origin !== targetOP) {
                                // El origen no provenía del OP; este mensaje debe rechazarse
                                return;
                      }
                      if (event.data === "unchanged") {
                                // La sesión del usuario continúa iniciada en el OP
                      } else {
                                // El usuario ha finalizado la sesión del OP
                      }
            }
	</script>
	</html>

Icono que indica el tipo de tema Tema de tarea

Nombre de archivo: twlp_oidc_session_mgmt_endpoint.html