MobileServices.web.js 未授权 api 调用

MobileServices.web.js unauthorized api call

当我让我的 WinJS 应用程序休眠一段时间然后再回到它时,我点击了一个按钮,出于某种原因我对后端的调用无法正常工作。

我从服务器收到 "Unauthorized" 错误。

如何修改 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);
});

我没有在每次 API 调用时都包装一个 promise,而是在客户端上加入了一个空闲例程,当用户 return 访问应用程序时刷新用户令牌,并且每 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