了解适配器会话和cookie管理

时间:2016-09-27 11:45:19

标签: session cookies ibm-mobilefirst mobilefirst-adapters

我正在开发一个IBM MobileFirst Platform 7.1.0应用程序,该应用程序使用受gicar / siteminder保护的多个Web服务。

根据一些教程中的建议,我创建了一个名为GicarManagementAdapter的适配器和一些其他适配器,每个Web服务都使用一个。

GicarManagementAdapter包含再次登录gicar / siteminder的逻辑。它实现了3种方法:

  1. “submitAuthentication”:这是客户端在登录时调用的方法。客户端使用推荐的ChallengeHandler授权协议
  2. “onLogout”:这是ChallengeHandler在注销时调用的注销方法
  3. “invokeService”:调用后端Web服务时,其他适配器使用此方法。
  4. 在submitAuthentication方法中,我通过httpClient库请求受gicar保护的资源(其中一个Web服务的wsdl文件)。 http请求为授权标头提供客户端提供的凭据。如果httr请求成功,则响应包含存储在当前客户端会话中的cookie GICSESSION:

    WL.Server.getClientRequest().getSession().setAttribute("GICAR-COOKIE", cookieValue);
    

    每当客户端应用程序想要访问后端时,它就会调用其中一个适配器方法。这些方法只构建SOAP主体并创建传递给GicarManagementAdapter.invokeService方法的invocationData。 invokeService方法只接受调用数据并添加存储在当前客户端会话中的cookie头:

    function invokeService(invocationData) {
    var gicarCookie = WL.Server.getClientRequest().getSession().getAttribute("GICAR-COOKIE");
    WL.Logger.info("Invoking service with coookie: " + gicarCookie);
    var headers = invocationData.headers || {};
    headers['cookie'] = gicarMgmt.cookieName + "=" + gicarCookie;
    
    invocationData.headers = headers;
    WL.Server.invokeHttp(invocationData);}
    

    (为了使用Session Expired cookie处理响应,代码有点复杂)

    不幸的是我无法控制后端。

    我见过几个问题:

    1. 客户端应用程序的目标平台之一是桌面浏览器。如果我在Google Chrome中打开指向桌面应用版本的3个标签,我可以看到GicarManagementAdapter如何通过httpclient记录3次并获得3个不同的Cookie。但是,每次有一个应用程序向后端查询数据时,都会使用最后一个cookie。我的意思是,无论每个chrome选项卡(会话?)执行查询,WL.Server.getClientRequest()。getSession()。getAttribute(“GICAR-COOKIE”);总是得到相同的cookie。这是否意味着他们都在分享同一个会话?

    2. 似乎WL.Server.invokeHttp忽略了提供的cookie标头。一段时间不活动(3分钟)后cookie过期。在cookie到期后的第一次调用中,我可以看到响应包含值为GICSESSION = LOGGEDOFF的Set-Cookie头。下一次调用会生成一个没有任何cookie信息的重定向表单。

    3. 也许我错了,但似乎WL.Server.invokeHttp忽略了cookie标头并使用了缓存的cookie。如果我关闭所有标签,再次打开并再次登录,我得到相同的结果:没有cookie标题的重定向表单。如果我重新部署某个适配器或重新启动worklight服务器,我只会再次登录。

      2016年4月10日编辑

      我可以检查MFP服务器和后端之间的流量。 GicarmanagementAdapter配置为忽略cookie(我在适配器的xml设置文件的连接部分添加了<cookiePolicy>IGNORE_COOKIES</cookiePolicy>标记)。我可以看到cookie被正确发送到后端。当cookie过期并且后端发送Set-Cookie:GICSESSION = LOGGEDOFF标头时,问题就开始了。 MFP服务器从WL.Server.InvokeHttp请求收到此标头后,会将此cookie添加到下一个请求中。所以流程如下:

      1. 登录后,Adapter调用后端发送登录步骤
      2. 获取的cookie
      3. 会话到期后,适配器会在调用WL.Server.InvokeHttp
      4. 时收到Set-Cookie:GICSESSION = LOGGEDOFF
      5. 适配器捕获LOGGGEDOFF cookie并通知客户端需要新的身份验证
      6. 客户端再次调用submitAuhtentication方法,通过apache httpClient获取新cookie并将其存储在客户端会话中
      7. 客户端请求新数据,以便适配器调用WL.Server.InvokeHttp来提供cookie标头,并在上次登录步骤中获取新cookie。
      8. MFP发送带有2个cookie的HTTP请求。第一个Cookie是由Adapt GICESSION = XXXXXXXX提供的,另一个是由MFP http客户端添加到场景后面的:GICSESSION = LOGGEDOFF。当后端收到最后一个cookie时,它会返回一个登录表单作为回复
      9. 似乎Worklight不尊重IGNORE_COOKIES设置。

        我需要一种方法来强制WL.Server http客户端在从后端收到Set-Cookie: GICSESSION = LOGGEDOFF后清除/删除Cookie。

0 个答案:

没有答案