IBM Worklight 6.0 - 如果客户端注销/登录,具有基本身份验证的适配器不会更新身份验证标头

Posted

技术标签:

【中文标题】IBM Worklight 6.0 - 如果客户端注销/登录,具有基本身份验证的适配器不会更新身份验证标头【英文标题】:IBM Worklight 6.0 - Adapter with basic auth doesn't update auth header if client logs out/in 【发布时间】:2013-07-21 14:57:09 【问题描述】:

我有一个使用基于适配器的身份验证的 Worklight v6.0 应用程序。

适配器是一个 HTTP 适配器,它使用 Basic Auth 调用后端 REST 服务。

适配器和后端服务之间没有会话或 cookie。在我的适配器描述符中,我已将 cookiePolicy 设置为 IGNORE_COOKIES。从适配器到后端的每个请求都使用该请求的基本身份验证标头进行身份验证。

每个适配器的过程都将 connectAs 设置为:endUser。

<?xml version="1.0" encoding="UTF-8"?>
<wl:adapter name="MyAdapter" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wl="http://www.worklight.com/integration" xmlns:http="http://www.worklight.com/integration/http">

<displayName>MyAdapter</displayName>
<description>MyAdapter</description>
<connectivity>
    <connectionPolicy xsi:type="http:HTTPConnectionPolicyType" cookiePolicy="IGNORE_COOKIES">
        <protocol>http</protocol>
        <domain>localhost</domain>
        <port>9080</port>
        <!-- Following properties used by adapter's key manager for choosing            
        <authentication>
            <basic />
        </authentication>
    </connectionPolicy>
    <loadConstraints maxConcurrentConnectionsPerNode="2" />
</connectivity>

<procedure name="submitAuthentication"></procedure>

<procedure connectAs="endUser" name="getCurrentUser"
    securityTest="MyAdapter-securityTest" />
</wl:adapter>

这一切都很好。移动应用程序在适配器上调用一个安全过程,这会触发身份验证,身份验证成功完成,该过程被重新调用,我可以在网络跟踪上看到正确的基本身份验证标头正在从适配器调用到后端。如果移动应用程序在已通过身份验证时进行适配器调用,则适配器只需使用正确的 Basic Auth 标头调用后端。如果多个移动应用同时连接并以不同用户身份登录,则适配器会为调用它的用户使用正确的 Basic Auth 标头。

唯一不起作用的是移动应用程序调用适配器,以 user1 身份进行身份验证,从后端为 user1 获取正确结果,调用 WL.Client.logout(),再次调用适配器,并且这次以用户 2 身份进行身份验证。

在适配器过程中,我调用 WL.Server.getActiveUser() 来验证活动用户,果然,用户是正确的(user2)。但是当调用到后端时,Worklight 添加的 Basic Auth Header 具有 user1 的凭据,因此移动应用程序会得到错误的结果。

如果我退出并重新启动应用程序,一切都很好,我可以直接以用户 2 身份进行身份验证,并为用户 2 获得正确的结果。唯一存在问题的情况是,当我在移动应用程序和 Worklight Server 之间的单个会话中以不同用户的身份注销/重新登录时。

这是对 Worklight 适配器使用基本身份验证的已知限制吗?我有什么方法可以在我注销时强制重置移动客户端和 Worklight Server 之间的连接? (没有重启应用)

【问题讨论】:

【参考方案1】:

既然您说“物理上”退出并重新打开应用程序会为您解决此问题,那么您可以在注销后立即使用WL.Client.reloadApp(),以便在登录-注销-登录的情况下保持应用程序流畅。看看有没有帮助。

【讨论】:

android 上,注销后调用 WL.Client.reloadApp() 会在移动应用程序和 Worklight 服务器之间产生一个新的 JSessionId,并且新的登录名会从后端获取正确的信息。在 ios 上,我无法查看网络跟踪,但我假设 WL.Client.reloadApp 不会导致移动应用程序和 Worklight 服务器之间的新会话,因为第二个登录用户会获得第一个用户的数据,即使在注销处理程序中调用 reloadApp()。 刚刚在 iOS 上获得了网络跟踪。 reloadApp() 也不会导致移动应用程序和工作灯服务器之间的新会话(即使调用了 reloadApp,JSESSIONID 也保持不变),并且第二个用户仍然获得第一个用户的数据。我应该在适配器的 logout() 过程中做些什么来清理 worklight 会话? 目前不知道,我们现在为此记录了一个缺陷。

以上是关于IBM Worklight 6.0 - 如果客户端注销/登录,具有基本身份验证的适配器不会更新身份验证标头的主要内容,如果未能解决你的问题,请参考以下文章

IBM Worklight 6.0 - 如何操作 Cordova.js 文件?

IBM Worklight 6.0 - 添加 Worklight 文件条目选项时遇到问题

IBM Worklight 6.0 - 内容根目录和本地 Worklight 服务器设置

IBM Worklight 6.0 - 访问 Worklight Server 时出错

IBM Worklight 6.0 - 默认情况下是不是包含 jQuery Mobile?

IBM Worklight 6.0 - Worklight Starter Dojo 示例损坏?