MobileServices.web.js未经授权的api电话

时间:2016-12-24 05:59:14

标签: javascript azure azure-mobile-services winjs

当我让我的WinJS应用程序休眠一段时间然后再回到它,然后我点击一个按钮,由于某种原因,我对后端的调用都没有工作。

我得到一个"未经授权的"来自服务器的错误。

如何修改invokeApi以便重新验证用户或其他内容?

有没有人有使用mobileservices.web.js的经验以及如何让最终用户永久登录而无需重新认证自己?

三江源。

client.invokeApi("getTopForumsTotal", {
    method: "post"
}).then(function (results) {
    // do something
}, function (error) {
    WinJS.log(error);
});

我使用winjs mobileService对用户进行身份验证。

client.login("microsoftaccount").done(function (results) {
    // Create a credential for the returned user.
    credential = new Windows.Security.Credentials.PasswordCredential("myapp", results.userId, results.mobileServiceAuthenticationToken);
    vault.add(credential);

    completeDispatcher();
}, function (error) {
    WinJS.log(JSON.stringify(error));
    errorDispatcher(error);
});

这就是我用来刷新最终用户令牌的方法。

client._request("GET", "/.auth/refresh", null, null, {
    accept: "application/json",
    "ZUMO-API-VERSION": "2.0.0"
}, [], (error, response) => {
    if (!error) {
        var userObject = JSON.parse(response.responseText)

        if (userObject.authenticationToken) {
            client.currentUser.mobileServiceAuthenticationToken = userObject.authenticationToken;

            testCall().done(function (success) {
                if (success) {
                    credential = new Windows.Security.Credentials.PasswordCredential("myapp", userObject.user.userId, userObject.authenticationToken);
                    vault.add(credential);
                    authenticated = true;
                    completeDispatcher();
                }
                else errorDispatcher('testCall API does not exist');
            });
        }
        else errorDispatcher('no authentication token returned');
    }
    else errorDispatcher(error);
});

1 个答案:

答案 0 :(得分:1)

我没有在每个API调用中包含一个promise,而是在客户端上合并了一个空闲例程,当用户令牌返回应用程序时刷新用户令牌,并且每隔59秒刷新一次令牌,这些令牌是空闲的。

因此,对于所有强烈和目的,他们将始终拥有有效的令牌或永久状态。

$(document).idle({
    onIdle: function () {
        // refresh user token
        if (User.Person !== null)
            User.Person.reauthenticate().done();
    },
    onActive: function () {
        // when the user returns refresh their token 1 more time
        if (User.Person !== null)
            User.Person.reauthenticate().done();
    },
    idle: 59000, // 59 seconds
    recurIdleCall: true // will keep refreshing every 59 seconds
});

https://github.com/kidh0/jquery.idle