您好我有以下情况。基于Ajax的Javascript应用程序,OpenAM代理以及OpenAM和JBoss使用REST Java Web服务。
如果我正确理解OpenAM文档,OpenAM Web Agent将作为Web服务器部分和OpenAM之间的中介。我的理解是,对于登录,注销,检查登录状态等简单服务,使用OpenAM apis和OpenAM代理应该足够了。例如,代理人负责处理令牌并将我们重定向到登录页面并返回到请求访问的原始页面。
令牌保存在HTTPOnly cookie中,使其无法访问。
同时可以从JBoss服务器访问coockie,因此理论上我可以实现针对OpenAM验证令牌的服务。还注销服务。我的理解是这样的实现将是一个黑客,因为首先,如果会话无效,我们不应该最终在JBoss服务器上。它应该是应该为我们执行此检查的代理。
我的问题是当我没有从浏览器访问令牌(HTTPOnly cookie)时如何检查登录状态,而不进行到JBoss服务器的往返只是为了访问cookie。另外如何在不涉及JBoss服务器的情况下实现Logout。
答案 0 :(得分:1)
如果我没有从浏览器访问令牌(HTTPOnly cookie)而没有执行到JBoss服务器的往返只是为了访问cookie,那么如何检查登录状态。
如果您处于HTTPOnly cookie模式的客户端(浏览器)并想要检查SSOToken cookie的有效性(默认名称iPlanetDirectoryPro),那么您可以调用AM服务器上的会话端点。您不需要获取cookie - 浏览器会将其添加到传出请求中 - 如果成功验证,它将返回令牌的详细信息。这样您就无法在客户端代码中获取令牌,但您可以解决它并回答您的问题。
请求:
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": {}
}
答案 1 :(得分:0)
代理应在浏览器中使用ssotoken设置cookie iplanetdirectorypro。这是我用来从cookie中获取iplanetdirectorypro令牌的一些代码。基本上它使用内置的JQuery操作来获取cookie。我希望它可以帮助您解决无法获取令牌的问题。
然后我通过ajax调用服务器以获取用户详细信息,并返回静态列表。您可以使用它,因为它验证用户是否已经过身份验证,令牌有效,或者根据您的需要进行更改。这有点超出了你的问题的范围,但我认为我将其作为潜在的下一步包括在内。
一些注意事项:您需要从cookie或会话中获取用户ID才能使用它。另外,我使用了一个按钮点击按钮2&#39;调用脚本并将其放回output-get-user-details,您可能需要更改它以反映您的调用。
我希望这会有所帮助。
$(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);
}