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身份验证的人。