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

Posted

技术标签:

【中文标题】IBM Worklight:WL.Client.getUserName 无法在身份验证后立即检索 userIdentity【英文标题】:IBM Worklight : WL.Client.getUserName Fails to retrieve userIdentity immediately after authentication 【发布时间】:2014-02-14 04:26:52 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

    您正在向服务器发出请求#1(比如说调用过程) 您收到了 authRequired:true 的响应 您正在提交身份验证数据 你得到 authRequred:false 您正在调用 submitSuccess() WL 框架自动重新调用请求#1 您收到请求#1 的响应

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

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

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

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

【讨论】:

以上是关于IBM Worklight:WL.Client.getUserName 无法在身份验证后立即检索 userIdentity的主要内容,如果未能解决你的问题,请参考以下文章

IBM Worklight - 啥是 Worklight 服务器?

安装 IBM Worklight Server

IBM Worklight 6.0 - 添加 Worklight 文件条目选项时遇到问题

IBM Worklight - 如何将 Worklight 代码导入 Eclipse?

IBM Worklight - 关于 Worklight Console 中的术语

IBM Worklight 6.0 - 访问 Worklight Server 时出错