IBM Mobile First 7.1 HTTP适配器安全测试

时间:2016-03-29 16:04:17

标签: authentication ibm-mobilefirst

我正在使用一个使用node.js web服务的http适配器来验证用户名和密码。

过程authenticatePatient和authenticateDoctor是不受保护的,因此我将在其他过程中使用安全性测试。

但是,当我试图调用其中一个时,也会调用质询处理程序,尽管事实上它们是不受保护的,如果我删除了质询处理程序,它运行正常!

PatientAuthRealmChallengeHandler.js

var patientAuthRealmChallengeHandler = WL.Client.createChallengeHandler("PatientAuthRealm");
patientAuthRealmChallengeHandler.isCustomResponse= function(response){

if(!response|| !response.responseJSON || response.responseText===null){
    return false;
}
if(typeof (response.responseJSON.authRequired)!== 'undefined'){
    return true;
}
else {
    return false;
   }
 }

patientAuthRealmChallengeHandler.handleChallenge = function(response){
 var authRequired = response.responseJSON.authRequired;

    if(authRequired==true){

        console.log("accées réfusé!!");
    }
 else if(authRequired==false){
        console.log(" déja authentifié ");
        patientAuthRealmChallengeHandler.submitSuccess();
    }

  }

Authentication.xml

  <procedure name="authenticatePatient" securityTest="wl_unprotected"/>
  <procedure name="authenticateDoctor"  securityTest="wl_unprotected"/>

Authentication-impl.js(只是authenticatePatient函数)

  function authenticatePatient(params){
  var url="/patient/authenticate";
  var response= callWS(url,params,"post");
  var size= response.patients.length;

 if(size!=0){
   userIdentity = {
            userId: params.username,
            displayName: params.username,
            attributes: {
            }
    };
    //WL.Server.setActiveUser("PatientAuthRealm", null);
    WL.Server.setActiveUser("PatientAuthRealm", userIdentity); // create session 

    return {
        authRequired: false,
        "response": response
    };
}
return onAuthRequired(null, "Invalid login credentials");
}
function onAuthRequired(headers, errorMessage){
errorMessage = errorMessage ? errorMessage : null;

return {
    authRequired: true,
    errorMessage: errorMessage
  };
   }
 function onLogout(){
  WL.Logger.debug("Logged out");
 }

authentificationConfig.xml(领域)

    <realm name="PatientAuthRealm" loginModule="PatientAuthLoginModule">
        <className>com.worklight.integration.auth.AdapterAuthenticator </className>
        <parameter name="login-function" value="authentication.onAuthRequired"/>
        <parameter name="logout-function" value="authentication.onLogout"/>
    </realm>

    <realm name="DoctorAuthRealm" loginModule="DoctorAuthLoginModule">
        <className>com.worklight.integration.auth.AdapterAuthenticator </className>
        <parameter name="login-function" value="authentication.onAuthRequired"/>
        <parameter name="logout-function" value="authentication.onLogout"/>
    </realm>

authentificationConfig.xml(LoginModule)

<loginModule name="PatientAuthLoginModule">
            <className>com.worklight.core.auth.ext.NonValidatingLoginModule</className>
    </loginModule>
    <loginModule name="DoctorAuthLoginModule">
        <className>com.worklight.core.auth.ext.NonValidatingLoginModule</className>
    </loginModule>

authentificationConfig.xml(安全测试)

  <customSecurityTest name="authenticatePatient">
        <test isInternalUserID="true" realm="PatientAuthRealm"/>
    </customSecurityTest>
    <customSecurityTest name="authenticateDoctor">
        <test isInternalUserID="true" realm="DoctorAuthRealm"/>
    </customSecurityTest>

1 个答案:

答案 0 :(得分:1)

重要的是要记住,任何http响应都可以调用函数isCustomResponse,而不仅仅是受保护的请求。此函数(isCustomResponse)的工作是确定此特定响应是否与此质询处理程序相关。

根据我在您的示例中所理解的,您向未受保护的authenticatePatient发出请求 然后,authenticatePatient返回:

return {
        authRequired: false,
        "response": response
    };

此JSON对象将发送到客户端。

您的isCustomResponse函数被触发(它不会检查这是否是受保护的请求,它会在每次响应时触发)。

isCustomResponse的实施应该足够聪明,以确定是否忽略此响应(return false;),或触发质询处理程序(return true;)。

对于您的实现,您似乎只检查response.responseJSON.authRequired是否已定义。您没有检查其值是true还是false。这意味着,您的代码确定此响应需要由质询处理程序处理。

我建议您更改isCustomResponse的实施,以检查response.responseJSON.authRequired的值,并仅在trueauthRequired时返回true