检查登录用户会话状态 OpenAM

Check logged in user session status OpenAM

您好,我有以下案例。 Ajax 基于 Javascript 应用程序、OpenAM 代理和 OpenAM 以及 JBoss 使用 REST java Web 服务。

如果我对 OpenAM 文档的理解正确,OpenAM Web Agent 在 Web 服务器部分和 OpenAM 之间充当中介。我的理解是,对于登录、注销、检查登录状态等简单服务,使用 OpenAM api 和 OpenAM 代理就足够了。例如,代理负责处理令牌并将我们重定向到登录页面并返回到请求访问的原始页面。

令牌保存在 HTTPOnly cookie 中,因此无法访问。

同时可以从 JBoss 服务器访问 coockie,因此理论上我可以实现针对 OpenAM 验证令牌的服务。还有注销服务。我的理解是,这样的实现将是一种黑客攻击,因为首先,如果会话无效,我们不应该在 JBoss 服务器上结束。应该是代理应该为我们执行此检查。

我的问题是当我无法从浏览器(HTTPOnly cookie)访问令牌时如何检查登录状态,而无需往返 JBoss 服务器仅获取对 cookie 的访问权限.还有如何在不再次涉及 JBoss 服务器的情况下实现注销。

代理应使用 ssotoken 在浏览器中设置 cookie iplanetdirectorypro。这是我用来从 cookie 中获取 iplanetdirectorypro 令牌的一些代码。基本上它是使用内置的 JQuery 操作来获取 cookie。希望能帮助大家解决无法获取token的问题。

然后我通过 ajax 调用服务器以获取用户详细信息,并返回一个静态列表。您可以使用它,因为它验证用户已通过身份验证且令牌有效,或者更改它以满足您的需要。这有点超出您的问题范围,但我认为我会将其作为潜在的下一步。

一些注意事项:您需要从 cookie 或会话中获取用户 ID 才能使用它。此外,我使用按钮单击 'button2' 来调用脚本并将其放回输出获取用户详细信息,您可能需要更改它以反映您的调用。

希望对您有所帮助。

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

how to check logged in status when I don|t have Access to the token from the browser (HTTPOnly cookie) without doing a roundtrip to the JBoss server only to get Access to the cookie.

如果您在 HTTPOnly cookie 模式下的客户端(浏览器)中并且想要检查 SSOToken cookie(默认名称 iPlanetDirectoryPro)的有效性,那么您可以调用 AM 服务器上的会话端点。您不需要获取 cookie - 浏览器会将其添加到传出请求中 - 如果成功验证,它将 return 令牌的详细信息。这样您就不会在客户端代码中获取令牌本身,但您可以解决它并回答您的问题。

要求:

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

{}

回复:

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