我们正在构建一个Worklight应用程序,它有两个步骤的身份验证过程。
步骤1:表单认证
我们使用的是现成的WASLTPARealm,它根据WebSphere中的自定义JAAS模块对我们进行身份验证,并返回LTPA令牌。
步骤2:自定义认证器
第二步是自定义认证器和登录模块,它:
- 读取步骤1中设置的LTPA cookie
- 使用LTPA cookie向另一个应用程序发出POST请求(这两个应用程序通过单点登录受信任)
- POST请求返回一个带有额外会话cookie的响应
- 用户通过认证
问题是,当使用文档中提供的客户端代码时,Custom Authenticator不会触发。基本上
customAuthenticator是通过通常的
创建的var customAuthenticator = WL.Client.createChallengeHandler("MyCustomRealm");
然后在客户端代码中
var reqURL = '/my_custom_auth_request_url';
var options = {};
options.parameters = {};
options.headers = {};
customAuthenticator.submitLoginForm(reqURL, options, customAuthenticator.submitLoginFormCallback);
返回404
[27/05/13 10:35:07:616 NZST] 00000326 WebSphereForm I com.worklight.core.auth.ext.WebSphereFormBasedAuthenticator processRequest FWLSE0055I: Not recognized.
[27/05/13 10:35:07:616 NZST] 00000326 Authenticatio E com.worklight.core.auth.impl.AuthenticationFilter doFilter FWLSE0048E: Unhandled exception caught: SRVE0190E: File not found: /apps/services/my_custom_auth_request_url
java.io.FileNotFoundException: SRVE0190E: File not found: /apps/services/my_custom_auth_request_url
这是因为请求被WebSphereFormBasedAuthenticator而不是我们的自定义Authenticator拾取。
我们通过
将请求URL写入自定义验证器中的日志public AuthenticationResult processRequest(HttpServletRequest request, HttpServletResponse response, boolean isAccessToProtectedResource) throws IOException, ServletException {
logger.info("Request URL is: " + request.getRequestURI());
但是这一行永远不会被击中。
两个验证器可以并排工作吗?我看到的行为是
var wlFormsAuthenticator = WL.Client.createChallengeHandler("WASLTPARealm");
和
var customAuthenticator = WL.Client.createChallengeHandler("MyCustomRealm");
似乎弄混了。我认为在customAuthenticator上调用submitLoginForm
不应该被WebSphereForms authenticator拾取,而应该去我们的自定义一个。
你能澄清预期的行为和潜在的解决方案吗?
同样,调用
是有效的WL.Client.login("MyCustomRealm", {
onSuccess: function() {
},
onFailure: function() {
}
});
在本例中,Java代码被击中,我们成功地验证了,但是, URL是
http://localhosT:9080/worklight/apps/services/api/MyApp/common/login
而不是my_custom_auth_request_url
,这意味着我们不能过滤掉Java代码中的请求。
希望这是有意义的。
你的描述中似乎混淆了一些术语。验证者是服务器端实体。自定义身份验证器是用Java实现的。挑战处理程序是一个客户端实体。它是用JavaScript实现的。
从你的描述,我猜你试图提交自定义身份验证器登录表单之前,实际上试图从WL服务器获得一些资源。问题是,只有在您尝试访问受保护的资源时才创建自定义身份验证器实例。除非您先触发身份验证,否则Authenticator将拒绝接收凭据(或者更一般地说,它实际上不存在)。所以您的方法是正确的,您可以先调用WL.Client.login("领域")来触发身份验证过程。其他选项包括:
- 使用安全测试保护应用程序环境并设置connectOnStartup:true
- 使用安全测试保护应用程序环境,设置connectOnStartup:false并使用WL.Client.connect() API。