IsCustomResponse 在基于适配器的身份验证中始终返回 false

Posted

技术标签:

【中文标题】IsCustomResponse 在基于适配器的身份验证中始终返回 false【英文标题】:IsCustomResponse is always returning false in Adapter-based authentication 【发布时间】:2015-04-24 18:53:52 【问题描述】:

我正在关注关于在https://developer.ibm.com/mobilefirstplatform/documentation/getting-started-7-0/authentication-security/adapter-based-authentication/ 上实现基于适配器的身份验证的教程

isCustomReponse 方法总是返回 false,因为“authRequired”不在响应中。如果我做错了什么,请帮助我。

适配器代码

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>

安卓代码

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);

    
  

【问题讨论】:

您查看过基于适配器的身份验证的原生 android 示例吗? developer.ibm.com/mobilefirstplatform/documentation/… 是的,我做了同样的事情,我在发布的代码中做错了吗? 样本是否适合您?在您进行更改之前? 我在您的客户端代码中的任何地方都看不到过程调用。但是我看到一个连接?您是否试图保护整个应用程序?确保您在应用程序描述符中添加了安全测试。 【参考方案1】:

在未设置 authRequired 的情况下多次调用 Challenge Handler 是正常的 - 这些只是不需要身份验证时的正常服务器响应。只有当您通过访问受保护的资源触发了身份验证过程时,才会出现该 authRequired 有效负载,这反过来会导致安全子系统调用适配器的 onAuthRequired 方法。

我建议在您的 onAuthRequired 方法中添加一个跟踪语句,这会在发生这种情况时向您显示。

正如 Nathan H 所说,最可能的原因是您没有访问受保护的资源,因为您没有将安全测试应用于适配器过程或整个应用程序。在您正在使用的示例中,有一个受保护的 getSecretData() 过程。

【讨论】:

很好的解释..“只有当您通过访问受保护的资源触发了身份验证过程时,才会出现 authRequired 有效负载”我没有在 IBM 文档中看到此声明。我在想,一旦我调用了注册挑战处理程序,移动首先会自动调用登录模块中存在的函数并发送带有 authrequired 的有效负载..非常感谢..

以上是关于IsCustomResponse 在基于适配器的身份验证中始终返回 false的主要内容,如果未能解决你的问题,请参考以下文章

isCustomResponse() API - 可用与否 MFPF8

电脑小白学习第一课---IP地址查询和设置

我们是不是应该在很大程度上基于本地 jwt 令牌到期日期来验证用户

IBM Worklight 6.1.0.1,基于 2 个适配器的身份验证出现问题

基于 IBM Worklight 适配器的身份验证

基于微信小程序计算机基础答疑系统设计与实现