2017-09-21 5 views
0

Hallo, ich habe den folgenden Fall. Ajax basierte Javascript Applikation, OpenAM Agent und OpenAM und JBoss Mit REST Java Web Services.Überprüfen Sie den angemeldeten Benutzersitzungsstatus OpenAM

Wenn ich die OpenAM-Dokumentation richtig verstehe, fungiert der OpenAM Web Agent als Vermittler zwischen dem Webserver-Teil und dem OpenAM. Meines Erachtens ist es für einfache Dienste wie Login, Logout, eingeloggten Login-Status ausreichend, OpenAM apis und den OpenAM-Agenten zu verwenden. Ein Beispiel dafür ist der Agent, der sich um das Token kümmert und uns zur Anmeldeseite und zurück zur ursprünglichen Seite umleitet, auf die Access angefordert wurde.

Das Token wird in einem HTTPOnly-Cookie gespeichert, wodurch es nicht zugänglich ist.

Gleichzeitig ist die Coockie vom JBoss-Server aus zugänglich, daher kann ich theoretisch Dienste implementieren, die das Token gegen OpenAM validieren. Auch Abmeldeservice. Mein Verständnis ist, dass eine solche Implementierung ein Hack wäre, weil wir nicht auf dem JBoss-Server landen sollten, wenn die Sitzung ungültig ist. Es sollte der Agent sein, der diese Prüfung für uns durchführen soll.

Meine Frage ist, wie ich den angemeldeten Status überprüfen kann, wenn ich keinen Zugriff auf das Token über den Browser (HTTPOnly-Cookie) habe, ohne einen Roundtrip zum JBoss-Server durchzuführen, um Zugriff auf den Cookie zu erhalten. Auch, wie Sie Logout implementieren, ohne den JBoss-Server erneut zu involvieren.

Antwort

1

wie in Status angemeldet zu überprüfen, wenn ich don | t Zugriff auf das Token aus dem Browser (Httponly-Cookie) haben, ohne nur eine Fülle an Annehmlichkeiten auf den JBoss-Server zu tun Zugang zu den Cookie zu erhalten.

Wenn Sie in einem Client (Browser) sind in Httponly-Cookie-Modus und wollen die Gültigkeit des SSOToken Cookie (Standardname iPlanetDirectoryPro) überprüfen, dann können Sie die Sitzungen Endpunkt rufen die AM-Server. Sie müssen den Cookie nicht abrufen - der Browser fügt ihn der ausgehenden Anfrage hinzu - und gibt bei erfolgreicher Validierung Details des Tokens zurück. Auf diese Weise erhalten Sie das Token selbst nicht im clientseitigen Code, aber Sie können es lösen und Ihre Frage beantworten.

Anfrage:

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 

{} 

Antwort:

{ 
    "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

Der Agent sollte einen Cookie iplanetdirectorypro im Browser mit dem Ssotoken setzen. Hier ist ein Code, den ich verwende, um das iplanetdirectorypro-Token aus dem Cookie zu holen. Im Grunde verwendet es die integrierte JQuery-Operation, um einen Cookie zu erhalten. Ich hoffe, es hilft Ihnen, das Problem zu umgehen, dass Sie das Token nicht erhalten können.

ich dann einen Anruf an den Server über Ajax macht Benutzerdaten zu erhalten, mit einer statischen Liste zurückgegeben werden. Sie können dies verwenden, da es überprüft, ob der Benutzer authentifiziert ist und das Token gültig ist, oder es an Ihre Bedürfnisse anpassen. Es ist etwas über den Rahmen Ihrer Frage hinaus, aber ich dachte, ich würde es als möglichen nächsten Schritt einbeziehen.

Ein paar Hinweise: Sie müssen den Benutzer-ID aus einem Cookie oder die Sitzung greifen, diese zu verwenden. Außerdem habe ich mit einem Knopf auf 'button2' geklickt, um das Skript aufzurufen und es in die Ausgabe-get-user-details zurückzusetzen, die Sie wahrscheinlich ändern müssen, um Ihre Anrufe wiederzugeben.

Ich hoffe, das hilft.

$(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); 
    } 
Verwandte Themen