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
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
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
Resultados
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.
<!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>