Ibm mobilefirst IBM Worklight:WL.Client.getUserName无法在身份验证后立即检索用户标识

Ibm mobilefirst IBM Worklight:WL.Client.getUserName无法在身份验证后立即检索用户标识,ibm-mobilefirst,worklight-adapters,worklight-security,worklight-runtime,Ibm Mobilefirst,Worklight Adapters,Worklight Security,Worklight Runtime,我已经完成了基于适配器的身份验证,在身份验证中没有问题,而且工作正常。我在获取活动用户的用户身份时遇到了一些问题。代码可能会对您进行更多的解释 adapterAuthRealmChallengeHandler.handleChallenge = function(response){ var authRequired = response.responseJSON.authRequired; if (authRequired == true){ if (respo

我已经完成了基于适配器的身份验证,在身份验证中没有问题,而且工作正常。我在获取活动用户的用户身份时遇到了一些问题。代码可能会对您进行更多的解释

adapterAuthRealmChallengeHandler.handleChallenge = function(response){
    var authRequired = response.responseJSON.authRequired;
    if (authRequired == true){
        if (response.responseJSON.errorMessage)
            alert(response.responseJSON.errorMessage);
    } else if (authRequired == false){
        adapterAuthRealmChallengeHandler.submitSuccess();
        setTimeout(function(){pageTransitionCall();},10000); //this code only works 
            pageTransitionCall(); //This throws null error in console
    }   
};
function pageTransitionCall(){
    console.log(WL.Client.getUserName("AdapterAuthRealm"));
}
正如你所看到的,我试图获取这个领域的活动用户名。
WL.Client.getUserName(“AdapterAuthRealm”)
仅在某个时间间隔后工作,我不确定该时间间隔。适配器代码如下所示

function submitAuthentication(username, password,userCred){
    if (username==="worklight" && password === "worklight"){
        WL.Logger.info("if");
            var userIdentity = {
                    userId: userCred,
                    displayName: userCred,
                    attributes: {
                        foo: "bar"
                    },
                    loginName : userCred,
                    userName : userCred
            };
            WL.Server.setActiveUser("AdapterAuthRealm", userIdentity);
            WL.Logger.info(JSON.stringify(userIdentity));
            return { 
                authRequired: false 
            };
        }
    else
    {
        WL.Logger.info("else");
        return onAuthRequired(null, "Invalid login credentials");
    }
}

我的疑问是为什么客户端无法检索activeuser。我确信我的代码是正确的,设置了活动用户,我可以在服务器日志中看到。设置
setactvieruser
后,我只有
return false
在适配器中,为什么客户端不能立即检索用户,为什么检索需要延迟。我已经在Worklight V6.0和Worklight V6.1中进行了验证。我已经创建了Ipad环境。

包含登录用户ID(基本上是任何用户标识数据)的信息在适配器身份验证后不会立即返回,而只有在原始请求成功时才会返回。考虑这个

  • 您正在向服务器发出请求#1(比如调用过程)
  • 您将得到authRequired的响应:true
  • 您正在提交身份验证数据
  • 你被授权:错误
  • 您正在呼叫submitSuccess()
  • WL框架自动重新调用请求#1
  • 您的请求得到了响应#1
  • userIdentity数据将在步骤7中返回,而不是在步骤4中返回。基本上,一旦启动身份验证流,您就被认为脱离了原始调用上下文。您需要完成流程并告诉WL framework auth已经完成。一旦您这样做,WL框架将重新调用原始请求。WL服务器将用户身份数据添加到响应中,WL客户端将更新用户名、显示名等属性

    如果您在此之前需要用户数据,例如,一旦完成身份验证,您可以立即将自定义属性添加到submitAuthentication函数响应中,例如

            WL.Server.setActiveUser("AdapterAuthRealm", userIdentity);
            return { 
                authRequired: false,
                loginName: userIdentity.loginName
            };
    

    这将确保loginName返回到handleChallenge函数。你可以在那里取回它,想用它做什么就用它做什么

    包含登录用户标识(基本上是任何用户标识数据)的信息在适配器身份验证后不会立即返回,而只有在原始请求成功时才会返回。考虑这个

  • 您正在向服务器发出请求#1(比如调用过程)
  • 您将得到authRequired的响应:true
  • 您正在提交身份验证数据
  • 你被授权:错误
  • 您正在呼叫submitSuccess()
  • WL框架自动重新调用请求#1
  • 您的请求得到了响应#1
  • userIdentity数据将在步骤7中返回,而不是在步骤4中返回。基本上,一旦启动身份验证流,您就被认为脱离了原始调用上下文。您需要完成流程并告诉WL framework auth已经完成。一旦您这样做,WL框架将重新调用原始请求。WL服务器将用户身份数据添加到响应中,WL客户端将更新用户名、显示名等属性

    如果您在此之前需要用户数据,例如,一旦完成身份验证,您可以立即将自定义属性添加到submitAuthentication函数响应中,例如

            WL.Server.setActiveUser("AdapterAuthRealm", userIdentity);
            return { 
                authRequired: false,
                loginName: userIdentity.loginName
            };
    
    这将确保loginName返回到handleChallenge函数。你可以在那里取回它,想用它做什么就用它做什么