我有一个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/

10-12 03:17