Accueil > OpenID Connect OAuth Serveur dédié > Développer > OpenID Connect > Management de session OpenID Connect avec iFrames

Management de session OpenID Connect avec iFrames

Cet article décrit l’implémentation dans OAuthSD du monitoring au moyen d’iFrames tel que décrit ici : OpenID Connect Session Management.

Point d’extrémité de gestion de session

https://oa.dnc.global/check_session

Processus

Pour déterminer le statut de connexion d’un utilisateur, l’application cliente (RP) charge une iframe dont la cible src est définie sur le point d’extrémité de la gestion de session du serveur OAuthSD (OP).

Le point de terminaison de gestion de session a accès à un cookie qui stocke l’état de connexion ou l’état du navigateur d’un utilisateur. Ce cookie d’état du navigateur est mis à jour lorsqu’un utilisateur se déconnecte de l’OP.

Le RP peut ensuite utiliser un script côté client pour appeler la fonction Window.postMessage () de l’OP iframe, en envoyant l’ID client et l’état de session actuellement connu dans le texte du message.
Si le RP reçoit en retour un postMessage du bloc OP avec la valeur "changed", alors le statut de connexion de l’utilisateur sur le PO a changé et le RP peut décider de déconnecter l’utilisateur ou non.
Si la valeur "unchanged" est renvoyée, l’utilisateur est toujours connecté à l’OP.

Etat OP du navigateur (OP Browser State)

Bien que l’on parle de l’ "état de connexion de l’utilisateur final sur l’OP", le management de session dont il est question ici considère en réalité l’état de "connexion du navigateur" de l’utilisateur.

On notera que différents RP lancés sur le même navigateur partageront la même session de navigateur fondée sur le même cookie opbs.

Paramètre session_state

Le contrôleur authorize envoie la valeur session_state dans la réponse d’authentification, conjointement au code d’autorisation.

La valeur est calculée comme suit :

session_state= hash( client_id + OP Browser State + origin url )

Ce paramètre est opaque pour le RP. Il doit le stocker d’une façon ou d’une autre, pourvu qu’il puisse en récupérer la valeur

Adaptation de l’application cliente

iFrame "côté client" : nous devons créer une ressource Web dans l’application cliente (RP) capable de charger une iframe ayant pour id "iframeOP" qui cible le point de terminaison de gestion de session de l’OP.
La ressource Web doit également avoir accès à la valeur d’état de session renvoyée dans le paramètre session_state de la réponse d’autorisation. La valeur d’état de session peut avoir été stockée dans un cookie, par exemple, ou de toute autre manière permettant au script côté client dans la ressource Web de connaître sa valeur.

Voici un exemple d’extrait de code HTML pour l’iframe "côté client" :

HTML

   <iframe id = "iframeOP" src =
       "https://oa.dnc.global/check_session"
       frameborder = "0" width = "0" height = "0">
   </ iframe>

Pour vérifier l’état de connexion d’un utilisateur, il faut appeler la fonction Window.postMessage () de l’op iframe, en transmettant l’ID client et l’état de session en tant que paramètre de message au format ID client + "" + État de session et nom d’hôte du serveur OP comme paramètre d’origine cible.

Dans l’exemple de fonction JavaScript suivant, le script s’attend à ce que la valeur de l’état de session soit stockée dans un cookie nommé session_state :

Javascript

  1.     var targetOP = "https://oa.dnc.global";
  2.     function check_session() {
  3.                var client = "<id_du_client>";  // ID du client (client_id) enregistré sur le serveur
  4.                var sessionState = $COOKIES["session_state"];
  5.                var mes = client + " " + sessionState;
  6.                var iframe = window.parent.document.getElementById ("iframeOP");
  7.                iframe.contentWindow.postMessage (mes, targetOP);
  8.     }

Télécharger

Configurez la ressource Web pour écouter les postMessages de l’OP transmettant l’état de connexion de l’utilisateur. L’application devrait déconnecter l’utilisateur ( mettre fin à la session locale ) si la valeur retournée indique la déconnexion.

L’exemple JavaScript suivant montre comment ajouter un écouteur d’événement à la ressource Web pour écouter de tels messages :

Javascript

  1.    
  2.     var targetOP = "https://oa.dnc.global";
  3.    
  4.     window.addEventListener ("message", receiveMessage, false);
  5.    
  6.     function receiveMessage (e) {
  7.  
  8.                if (e.origin! == targetOP) {
  9.                          // L'origine ne vient pas de l'OP; ce message doit être rejeté.
  10.                          return;
  11.                }
  12.                if (e.data === "connected") {
  13.                          // L'utilisateur est toujours connecté à l'OP
  14.                          ...
  15.                } else{
  16.                          // l'utilisateur s'est déconnecté de l'OP
  17.                          ...
  18.                }
  19.     }

Télécharger

Notes :
- Le RP doit s’assurer que l’origine du postMessage correspond au nom d’hôte OP attendu. Tous les messages qui ne correspondent pas doivent être rejetés.
- Proxy : si l’application doit passer par un proxy pour accéder à OAuthSD (l’OP), la valeur qui doit être indiquée pour toute URL liée à l’OP doit contenir l’hôte et le port du proxy, et non l’hôte et le port de l’OP externe.