2017-09-21 2 views
0

Bonjour J'ai le cas suivant. Application JavaScript basée sur Ajax, agent OpenAM et OpenAM et JBoss avec les services web Java REST. Si je comprends bien la documentation OpenAM, l'Agent Web OpenAM fonctionne comme médiateur entre la partie serveur Web et l'OpenAM. Ma compréhension est que pour les services simples comme la connexion, la déconnexion, l'état de connexion vérifiée, il devrait suffire d'utiliser OpenAM apis et l'agent OpenAM. Par exemple, c'est l'agent qui prend soin du jeton et nous redirige vers la page de connexion et revient à la page d'origine à laquelle Access a été demandé.Vérification de l'état de session de l'utilisateur connecté OpenAM

Le jeton est conservé dans un cookie HTTPOnly qui le rend inaccessible.

En même temps, le coockie est accessible à partir du serveur JBoss, donc théoriquement je peux mettre en œuvre des services qui valident le jeton contre OpenAM. Aussi le service de déconnexion. Ma compréhension est qu'une telle implémentation serait un hack car en premier lieu nous ne sommes pas supposés finir sur le serveur JBoss si la session est invalide. Ce devrait être l'agent qui devrait effectuer cette vérification pour nous.

Ma question est de savoir comment vérifier l'état de connexion lorsque je n'ai pas accès au token depuis le navigateur (cookie HTTPOnly) sans faire un aller-retour vers le serveur JBoss uniquement pour avoir accès au cookie. Aussi comment implémenter Logout sans impliquer le serveur JBoss à nouveau.

Répondre

1

Comment vérifier l'état connecté quand je ne | avez pas accès au jeton à partir du navigateur (cookies HTTPOnly) sans faire un aller-retour au serveur JBoss uniquement pour obtenir l'accès au cookie.

Si vous êtes un client (navigateur) en mode cookie HTTPOnly et que vous voulez vérifier la validité du cookie SSOToken (nom par défaut iPlanetDirectoryPro), vous pouvez appeler les sessions de point final sur le serveur AM. Vous n'avez pas besoin d'obtenir le cookie - le navigateur l'ajoutera à la demande sortante - et il retournera les détails du jeton s'il est validé avec succès. De cette façon, vous n'obtenez pas le jeton lui-même dans le code côté client, mais vous pouvez le résoudre et répondre à votre question.

Demande:

POST /openam/json/sessions?_action=getSessionInfo HTTP/1.1 
Host: myserver.com:8080 
Content-Type: application/json 
Cookie: iPlanetDirectoryPro=... <-- added by browser, not in code 
Accept-API-Version: protocol=1.0,resource=2.0 
Cache-Control: no-cache 

{} 

Réponse:

{ 
    "username": "demo", 
    "universalId": "id=demo,ou=user,dc=openam,dc=forgerock,dc=org", 
    "realm": "/", 
    "latestAccessTime": "2017-09-28T20:15:17Z", 
    "maxIdleExpirationTime": "2017-09-28T20:45:17Z", 
    "maxSessionExpirationTime": "2017-09-28T22:15:16Z", 
    "properties": {} 
} 
0

L'agent doit définir un cookie iplanetdirectorypro dans le navigateur avec le ssotoken. Voici un code que j'utilise pour récupérer le jeton iplanetdirectorypro du cookie. Fondamentalement, il utilise l'opération JQuery intégrée pour obtenir un cookie. J'espère que cela vous aidera à contourner le problème de ne pas pouvoir obtenir le jeton. Je passe ensuite un appel au serveur via ajax pour obtenir les détails de l'utilisateur, avec une liste statique renvoyée. Vous pouvez l'utiliser, car il vérifie que l'utilisateur est authentifié et que le jeton est valide, ou modifiez-le selon vos besoins. C'est un peu au-delà de la portée de votre question, mais j'ai pensé que je l'inclurais comme une prochaine étape potentielle. Un couple de notes: Vous devrez saisir l'ID utilisateur à partir d'un cookie ou de la session pour l'utiliser. De plus, j'ai utilisé le bouton 'button2' pour appeler le script et le remettre dans le fichier output-get-user-details, que vous devrez probablement modifier pour refléter vos appels.

J'espère que cela aide.

$(function() { 
     $(".btn.button2").click(function() { 
      var frapptokenid = readCookie('iPlanetDirectoryPro'); 
      var frappusername = readCookie('frappusername'); 
      $.ajax({ 
       url: "http://rocklabs.openrock.org:8181/openam/json/users/" + frappusername, 
       type: "GET", 
       headers: { 
        "accept": "application/json", 
        "dataType": "jsonp", 
        "content-type": "application/json;odata=verbose", 
        "iplanetdirectorypro": frapptokenid, 
       }, 
        $('#get-user-details').append(
         $('#output-get-user-details').append(
          ` 
          <div> 
          <div>         
           <form style="display:inherit; word-wrap:break-word; white-space: normal"> 
            <table align="center"> 
             <thead> 
              <tr bgcolor="#233f6d"> 
              <th>Attribute</th> 
              <th>Returned Data</th> 
              </tr> 
             </thead> 
             <tbody style="text-align:left"> 
              <tr> <td>User ID</td><td>${data.username}</td> </tr> 
              <tr> <td>Surname</td><td> ${data.sn}</td> </tr> 
              <tr> <td>Given Name</td><td> ${data.givenName}</td> </tr> 
              <tr> <td>Phone Number</td><td> ${data.telephoneNumber}</td> 
              <tr> <td>Email Address</td><td> ${data.mail}</td> </tr> 
              <tr> <td>Universal ID</td><td> ${data.universalid}</td> </tr> 
              </tr> 
             </tbody> 
            </table> 
           </form> 
           </div> 
          </div> 
          ` 
         ) 
       )}, 
       failure: function(data) { 
        console.log(data); 
       } 
      }); 
     }); 
    }); 

/*Functions for creating, reading and deleting cookies*/ 

    function createCookie(name,value,days) { 
     if (days) { 
      var date = new Date(); 
      date.setTime(date.getTime()+(days*24*60*60*1000)); 
      var expires = "; expires="+date.toGMTString(); 
     } 
     else var expires = ""; 
     document.cookie = name+"="+value+expires+"; path=/"; 
    } 

    function readCookie(name) { 
     var nameEQ = name + "="; 
     var ca = document.cookie.split(';'); 
     for(var i=0;i < ca.length;i++) { 
      var c = ca[i]; 
      while (c.charAt(0)==' ') c = c.substring(1,c.length); 
      if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); 
     } 
     return null; 
    } 

    function eraseCookie(name) { 
     createCookie(name,"",-1); 
    }