无法通过 Office JS API 获取用户身份令牌

问题描述 投票:0回答:2

我们的生产客户遇到以下错误: Office JS API 不返回用户身份令牌,这会阻止我们加载项的全部使用。

我们在日志中看到的错误:

{
    "name": "AccessRestricted",
    "message": "Internal protocol error: '-2147467259'.",
    "code": 9017
}

有时笔记本电脑在睡眠模式后唤醒时会出现,有时不会。

此外,当我们的代码执行get user identity token async时,Office JS API中有时会出现以下错误(但不是每次出现

AccessRestricted
错误时):

"Unable to get property 'Execute' of undefined or null reference",
"number": -2146823281,
"stack": 
    "TypeError: Unable to get property 'Execute' of undefined or null reference
     at n.prototype.execute (https://appsforoffice.microsoft.com/lib/1... (truncated by our logging system)

Outlook 版本为 16.0.8528.2147,加载项已固定。 附言Office JS API 已初始化,这不是此问题的根本原因。

这里是代码片段:

sfMailApp.OfficeManager.prototype.getCallbackTokenAsync = function () {
    var item = this.getItem();

    return !item.isFake ? this._loadItemAsync(Office.context.mailbox, 'getCallbackTokenAsync') : sfMailApp.utils.resolveDeferred('');
};

sfMailApp.OfficeManager.prototype.getIdentityTokenAsync = function (force) {
    var ls = getLocalStorage();
    var lastUpdateIdentityTokenTimestamp = ls.getItem('identityTokenUpdate');
    var cachedIdentityToken = ls.getItem('identityToken');

    var lastUpdateIdentityTokenDifference = !sfMailApp.utils.isNullOrEmpty(lastUpdateIdentityTokenTimestamp) ? (new Date().getTime() - parseInt(lastUpdateIdentityTokenTimestamp)) : null;

    if (sfMailApp.utils.isNullOrEmpty(cachedIdentityToken) || cachedIdentityToken === 'null' || sfMailApp.utils.isNullOrEmpty(lastUpdateIdentityTokenDifference) || force ||
        (lastUpdateIdentityTokenDifference / (1000 * 60)) > sfMailApp.settings.identityTokenUpdateIntervalMinutes) {
        var deferred = $.Deferred();

        var item = this.getItem();

        if (!item.isFake) {
            sfMailApp.analytics.trackEvent('LoadUserIdentityTokenAsync', 'Start', {
                user: sfMailApp.mailService.userEmail
            });

            this._loadItemAsync(Office.context.mailbox, 'getUserIdentityTokenAsync').done(function (token) {
                ls.setItem('identityTokenUpdate', new Date().getTime());
                ls.setItem('identityToken', token);
                sfMailApp.sessionManager.setIdentityToken(token);
                deferred.resolve(token);
            }).fail(function (err) {
                ls.setItem('identityTokenUpdate', null);
                ls.setItem('identityToken', null);
                sfMailApp.analytics.trackEvent('LoadUserIdentityTokenAsync', 'Fail', {
                    user: sfMailApp.mailService.userEmail,
                    message: err ? JSON.stringify(err) : 'null'
                });
                deferred.reject(err);
            });
        } else {
            sfMailApp.analytics.trackEvent('Item', 'Empty', {
                user: sfMailApp.mailService.userEmail,
                message: 'Error while getting identity token - inbox item is empty'
            });
            sfMailApp.sessionManager.setIdentityToken(cachedIdentityToken);
            return sfMailApp.utils.resolveDeferred(cachedIdentityToken);
        }

        return deferred.promise();
    } else {
        sfMailApp.sessionManager.setIdentityToken(cachedIdentityToken);
        return sfMailApp.utils.resolveDeferred(cachedIdentityToken);
    }
};


sfMailApp.OfficeManager.prototype._loadItemAsync = function (obj, name) {

    if (sfMailApp.utils.isCommands() && sfMailApp.isCommandsMagicPixel) {
        return sfMailApp.utils.rejectDeferred({
            message: 'Async Office JS API should not be called in Commands while inserting MagicPixel'
        });
    }

    var deferred = $.Deferred();

    var maxAttempCount = 5;
    var attempInterval = 1000;
    var attempCount = 0;
    var _this = this;

    function checkResult(asyncResult) {
        var processFunc = function () {
            try {
                if (_this._checkProperyExists(obj, name)) {
                    obj[name](checkResult);
                } else {
                    checkResult(null);
                }
            } catch (e) {
                if (name !== 'loadCustomPropertiesAsync' && name !== 'getCallbackTokenAsync') {
                    sfMailApp.analytics.trackException(e, name + '.Fail', {
                        user: sfMailApp.mailService.userEmail,
                        error: e ? JSON.stringify(e) : null
                    });
                }
                checkResult(null);
            }
        }

        if ((sfMailApp.utils.isNullOrEmpty(asyncResult) || asyncResult.status !== Office.AsyncResultStatus.Succeeded) && attempCount < maxAttempCount) {
            attempCount++;
            if (attempCount <= 1) {
                processFunc();
            } else {
                setTimeout(processFunc, attempInterval);
            }
        } else {
            if (asyncResult && asyncResult.status === Office.AsyncResultStatus.Succeeded) {
                deferred.resolve(asyncResult.value);
            } else {
                var params = {
                    user: sfMailApp.mailService.userEmail
                };
                if (asyncResult) {
                    params.status = asyncResult.status;
                    params.value = asyncResult.value;
                    params.error = JSON.stringify(asyncResult.error);
                }

                if (name !== 'loadCustomPropertiesAsync' && name !== 'getCallbackTokenAsync') {
                    sfMailApp.analytics.trackException(new Error(name + '.Fail'), '', params);
                }
                deferred.reject(asyncResult);
            }
        }
    }

    var inboxItem = this.getItem();

    if (obj && !obj.isFake && !inboxItem.isFake) {
        checkResult(null);
    } else {
        deferred.resolve({});
    }

    return deferred.promise();
};
office-js outlook-web-addins
2个回答
0
投票

感谢您让我们知道,Sviatoslav。我们知道这个问题,目前正在调查中。确定修复后,我们将更新此答案!


0
投票

我知道这是一篇旧帖子,但我们有一个客户端,我们在从 Mac 上的 Outlook 调用 Office.context.mailbox.getUserIdentityTokenAsync 时出现完全相同的错误代码:

{
  "status": "failed",
  "error": {
    "name": "AccessRestricted",
    "message": "Intern protokolfejl: '-2147467259'.",
    "code": 9017
  },
  "diagnostics": {
    "InvokeCodeResult": -2147467259
  }
}

Office.context.diagnostics 是

{
  "host": "Outlook",
  "version": "16.72.409.0",
  "platform": "Mac"
}

我有一台 Mac,其 Outlook 版本完全相同(连接到不同的租户),并且工作正常

© www.soinside.com 2019 - 2024. All rights reserved.