我有一个HTML5 / JQuery cordova混合应用程序,该应用程序与外部REST Web服务通信以获取页面动态内容的数据。这些REST资源受Siteminder SSO保护。 siteminder会拦截对Web服务的所有调用,如果会话未处于活动状态,则会抛出siteminder登录质询页面。
我们如何处理移动应用中的siteminder登录页面?
目前,我们有index.html,在该onload上提交了页面(index.html)并命中了受保护的REST服务,但siteminder拦截了该事件以抛出挑战页面。经过身份验证后,它可以访问受保护的REST服务,并从REST服务返回“成功”的json结果。
基于此,我们需要从siteminder cookie的移动密码中调用其他页面/ REST服务以进行会话验证。实现此目标的正确方法是什么?
最佳答案
最后,我已经能够使用以下方法使其工作:
所有REST资源URL必须受siteminder保护。
定义一个GET服务,它也是一个受保护的资源,将用于启动siteminder会话。
例如
@Context private HttpServletRequest httpRequest;
@GET
@Path("/OAMSSO")
@Produces(MediaType.APPLICATION_JSON)
public Response getOAMSSO() {
URI uri = null; UriBuilder uriBuilder = null;
String redirectHost = "https://localhost/callback";
uri = uriBuilder.queryParam("statusCode", "100")
.queryParam("authenticated", "true")
.queryParam("userName",
headers.getHeaderString("SM_USER")).build();
return Response.seeOther(uri).build();
}
在您的JS中,以下代码将在InAppBrowser中启动siteminder SSO身份验证。 InAppBrowser是一个Cordova插件,需要添加到您的项目中。
cordova插件添加cordova-plugin-inappbrowser
function getParameterByName(url, name) {
var match = RegExp('[?&]' + name + '=([^&]*)').exec(url);
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}
document.addEventListener("deviceReady", "onDeviceReady",false);
function onDeviceReady() {
callOAMSSO();
}
function callOAMSSO() {
var url = **<<yourProtectedServiceURL>>**/OAMSSO";
var target = '_blank';
var options = "location=yes,toolbar=yes,clearcache=yes,clearsessioncache,enableViewportScale=yes";
var redirectURL = "https://localhost/callback";
var ref = cordova.InAppBrowser.open(url, target, options);
ref.addEventListener('loadstart', loadstartCallback);
ref.addEventListener('exit', exitCallback);
function loadstartCallback(event) {
var url = event.url;
if(url.indexOf(redirectURL) > -1){
ref.close();
var statusCode = getParameterByName(url, 'statusCode');
var authenticated = getParameterByName(url, 'authenticated');
var userName = getParameterByName(url, 'userName');
if(statusCode && userName){
sessionStorage.userName = userName.toUpperCase();
sessionStorage.userNameisValid = "Y";
setTimeout(**invokeYourFunctionForOtherTasks**, 10);
}
}
}
function exitCallback() {
alert('Browser is closed...');
}
}
当您的应用打开时,InAppBrowser将打开,并尝试获取OAMSSO保护的资源。由于受Siteminder保护,并且没有会话可用,因此SSO页面在浏览器中打开,用户可以在其中输入凭据并提交。如果凭据成功,siteminder将添加SMSESSION cookie,然后重定向到OAMSSO REST资源。 OAMSSO REST资源提取siteminder身份验证的用户名,并将其作为查询参数附加到回调方法中,即重定向到localhost / callback。这只是一个虚拟URL,用于标识siteminder已对用户进行身份验证。在JS中,您可以检查此URL负载,提取用户名,然后继续执行应用程序的其他任务。由于siteminder会话已经处于活动状态,因此您可以从应用程序访问REST服务的其他受保护资源。
希望这对任何使用Javascript处理siteminder SSO身份验证的人有所帮助。
关于jquery - Cordova Hybrid应用程序与Siteminder protected REST资源集成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39078951/