2

https://developer.ibm.com/mobilefirstplatform/documentation/getting-started-7-0/authentication-security/adapter-based-authentication/のアダプターベースの認証の実装に関するチュートリアルに従っています

isCustomReponse「authRequired」が応答にないため、メソッドは常に false を返します。私が何か間違ったことをしているなら、私を助けてください。

アダプターコード

function onAuthRequired(headers, errorMessage){
    errorMessage = errorMessage ? errorMessage : null;

    return {
        authRequired: true,
        errorMessage: errorMessage
    };
}

function submitAuthentication(username, password){
  // if (username==="user" && password === "user"){

    var userIdentity = {
        userId: username,
        displayName: username,
        attributes: {
          foo: "bar"
        }
    };

    WL.Server.setActiveUser("SingleStepAuthRealm", userIdentity);

    return {
      authRequired: false
    };
  // }

  // return onAuthRequired(null, "Invalid login credentials");
}


function onLogout(){
    WL.Logger.debug("Logged out");
}

AuthenticationConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<tns:loginConfiguration xmlns:tns="http://www.worklight.com/auth/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

        <!-- Licensed Materials - Property of IBM
             5725-I43 (C) Copyright IBM Corp. 2006, 2013. All Rights Reserved.
             US Government Users Restricted Rights - Use, duplication or
             disclosure restricted by GSA ADP Schedule Contract with IBM Corp. -->  

     <staticResources>
     <!--  
            <resource id="logUploadServlet" securityTest="LogUploadServlet">
            <urlPatterns>/apps/services/loguploader*</urlPatterns>
        </resource>
        -->
        <resource id="subscribeServlet" securityTest="SubscribeServlet">
            <urlPatterns>/subscribeSMS*;/receiveSMS*;/ussd*</urlPatterns>
        </resource>

    </staticResources> 


     <securityTests>

        <customSecurityTest name="SubscribeServlet">
            <test realm="SubscribeServlet" isInternalUserID="true"/>
        </customSecurityTest>   

        <customSecurityTest name="SingleStepAuthAdapter-securityTest">
            <test isInternalUserID="true" realm="SingleStepAuthRealm"/>
        </customSecurityTest>



    </securityTests> 

    <realms>

    <realm loginModule="AuthLoginModule" name="SingleStepAuthRealm">
            <className>com.worklight.integration.auth.AdapterAuthenticator</className>
            <parameter name="login-function" value="SingleStepAuthAdapter.onAuthRequired"/>
            <parameter name="logout-function" value="SingleStepAuthAdapter.onLogout"/>
        </realm>
        <realm name="SampleAppRealm" loginModule="StrongDummy">
            <className>com.worklight.core.auth.ext.FormBasedAuthenticator</className>
        </realm>

        <realm name="SubscribeServlet" loginModule="rejectAll">
            <className>com.worklight.core.auth.ext.HeaderAuthenticator</className>          
        </realm>

    </realms>

    <loginModules>
        <loginModule name="AuthLoginModule">
            <className>com.worklight.core.auth.ext.NonValidatingLoginModule</className>
        </loginModule>
        <loginModule name="StrongDummy" expirationInSeconds="-1">
            <className>com.worklight.core.auth.ext.NonValidatingLoginModule</className>
        </loginModule>

        <loginModule name="requireLogin" expirationInSeconds="-1">
            <className>com.worklight.core.auth.ext.SingleIdentityLoginModule</className>
        </loginModule>

        <loginModule name="rejectAll">
            <className>com.worklight.core.auth.ext.RejectingLoginModule</className>
        </loginModule>

    </loginModules>

</tns:loginConfiguration>

Android コード

public void IBMPushNotification() {

  try {
    client.registerChallengeHandler(newLoginChallengeHandler(realm,"test"));
    client.connect(new MyConnectionListener());
  } catch (Exception ex) {
    ex.printStackTrace();
  }
}

ログイン チャレンジ ハンドラ

private LoginChallengeHandler challengeHandler;
private String realm = "SingleStepAuthRealm";


public class LoginChallengeHandler extends ChallengeHandler{

  private String userName;

    public LoginChallengeHandler(String realm,String user) {
      super(realm);
      userName = user;
    }

    @Override
    public boolean isCustomResponse(WLResponse wlResponse) {
      try {
        if(wlResponse!= null && wlResponse.getResponseJSON()!=null &&
            wlResponse.getResponseJSON().isNull("authRequired") != true &&
            wlResponse.getResponseJSON().getBoolean("authRequired") == true){

          return true;
        }
      } catch (Exception e) {
          e.printStackTrace();
      }

      return false;
    }

    @Override
    public void handleChallenge(WLResponse wlResponse) {
      submitLogin(userName,"dummy");
    }

    @Override
    public void onSuccess(WLResponse wlResponse) {

      if(isCustomResponse(wlResponse)) {
        handleChallenge(wlResponse);
      } else {
        submitSuccess(wlResponse);
      }
    }

    @Override
    public void onFailure(WLFailResponse wlFailResponse) {    
    }

    public void submitLogin(String userName, String password){
      Object[] parameters = new Object[]{userName, password};
      WLProcedureInvocationData invocationData = new WLProcedureInvocationData("SingleStepAuthAdapter", "submitAuthentication");
      invocationData.setParameters(parameters);
      WLRequestOptions options = new WLRequestOptions();
      options.setTimeout(30000);
      submitAdapterAuthentication(invocationData, options);

    }
  }
4

1 に答える 1

1

チャレンジ ハンドラが authRequired が設定されていない状態で何度も呼び出されるのは正常です。これは、認証が不要な場合の通常のサーバー応答です。その authRequired ペイロードは、保護されたリソースにアクセスして認証プロセスをトリガーした場合にのみ存在します。これにより、セキュリティ サブシステムがアダプターの onAuthRequired メソッドを呼び出します。

onAuthRequired メソッドに trace ステートメントを追加することをお勧めします。これにより、それがいつ発生するかがわかります。

Nathan H が言っているように、ここで最も可能性の高い原因は、セキュリティ テストをアダプタ プロシージャまたはアプリケーション全体に適用していないため、保護されたリソースにアクセスしていないことです。あなたが作業している例では、非常に保護されている getSecretData() プロシージャがあります。

于 2015-04-27T05:35:27.563 に答える