IBM Worklight:WL.Client.getUserName无法在身份验证后立即检索userIdentity

时间:2014-02-14 04:26:53

标签: ibm-mobilefirst worklight-adapters worklight-security worklight-runtime

我已经完成了基于适配器的身份验证,身份验证没有问题,而且运行正常。我在获得活跃用户的用户身份方面遇到了一些问题。代码可能会向您解释一下

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在adpter中,为什么客户端无法检索到用户即时以及为什么需要延迟检索。我已在Worklight V6.0和Worklight V6.1.i中验证过已创建Ipad环境。

1 个答案:

答案 0 :(得分:4)

包含登录的userId(基本上任何userIdentity数据)的信息在适配器身份验证后不会立即返回,但仅在原始请求成功时才返回。考虑一下这个

  1. 您正在向服务器发出请求#1(假设调用过程)
  2. 您正在使用authRequired:true
  3. 获得回复
  4. 您正在提交身份验证数据
  5. 您正在获取authRequred:false
  6. 您正在调用submitSuccess()
  7. WL框架自动重新调用请求#1
  8. 您收到了对请求#1
  9. 的回复

    userIdentity数据将在步骤7中返回,而不是在步骤4中返回。基本上,一旦启动身份验证流程,您就会被认为不在原始调用上下文中。您需要完成流程并告诉WL框架auth已完成。一旦你这样做 - WL框架将重新调用原始请求。 WL服务器将userIdentity数据添加到响应中,WL客户端将更新userName,displayName等属性。

    如果您之前需要用户数据,例如一旦auth完成,您就可以立即向submitAuthentication函数响应中添加自定义属性,例如

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

    这将确保loginName将返回到handleChallenge函数。你可以在那里找回它并用它做任何你想做的事。