关于jquery:Cordova Hybrid应用程序与Siteminder受保护的REST资源集成

Cordova Hybrid app integration with Siteminder Protected REST resource

我有一个HTML5 / JQuery cordova混合应用程序,可与外部REST Web服务通信以获取页面动态内容的数据。这些REST资源受Siteminder SSO保护。所有对Web服务的调用都会被siteminder拦截,如果会话未处于活动状态,则会抛出siteminder登录质询页面。

我们如何处理移动应用中的siteminder登录页面?

当前,我们有index.html,在该onload上提交了页面(index.html)并命中了受保护的REST服务,但siteminder拦截并抛出了质询页面。经过身份验证后,它可以访问受保护的REST服务,并从REST服务返回" success "的json结果。

基于此,我们需要在siteminder cookie上从移动密码中调用其他页面/ REST服务以进行会话验证。实现此目标的正确方法是什么?


最后,我已经可以通过以下方法使它起作用:

  • 所有REST资源URL必须受siteminder保护。

  • 定义GET服务,该服务也是一种受保护的资源,将用于启动siteminder会话。
    例如

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    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保护的资源。由于Sicne受Siteminder保护,并且没有会话可用,因此SSO页面在浏览器中打开,用户可以在其中输入凭据并提交。如果凭据成功,siteminder将添加SMSESSION cookie,然后重定向到OAMSSO REST资源。 OAMSSO REST资源提取siteminder身份验证的用户名,并将其作为查询参数附加到回调方法中,即重定向到localhost / callback。这只是一个虚拟URL,用于标识该用户已被siteminder认证。在JS中,您可以检查此URL负载,提取用户名,然后继续执行应用程序的其他任务。由于siteminder会话已经处于活动状态,因此您可以从应用程序访问REST服务的其他受保护资源。

    希望这可以帮助任何使用Javascript处理siteminder SSO身份验证的人。