Office365 使用Outlook加载项令牌获取带有EWS Java API的当前项目服务器端

Office365 使用Outlook加载项令牌获取带有EWS Java API的当前项目服务器端,office365,outlook-addin,office365api,office-addins,Office365,Outlook Addin,Office365api,Office Addins,我正在构建Outlook加载项,并尝试使用登录令牌使用EWS Java API“下载”当前选定的项目(=邮件消息)。下一步是获取附件并在系统服务器端处理它们 下面是使用mailbox.getCallbackTokenAsync方法检索登录令牌的步骤。 我将此令牌发布到我们的服务器(也为外接程序提供服务),并使用EWS Java Api获取当前选定的项 但我无法使用令牌登录。我在服务器端收到的异常是远程服务器返回了一个错误:(401)未经授权 在外接程序令牌中,我使用以下javascript代码调

我正在构建Outlook加载项,并尝试使用登录令牌使用EWS Java API“下载”当前选定的项目(=邮件消息)。下一步是获取附件并在系统服务器端处理它们

下面是使用
mailbox.getCallbackTokenAsync
方法检索登录令牌的步骤。 我将此令牌发布到我们的服务器(也为外接程序提供服务),并使用EWS Java Api获取当前选定的项

但我无法使用令牌登录。我在服务器端收到的异常是
远程服务器返回了一个错误:(401)未经授权

在外接程序令牌中,我使用以下javascript代码调用我们的服务:

(function(){
  'use strict';

  // The Office initialize function must be run each time a new page is loaded
  Office.initialize = function(reason){
    jQuery(document).ready(function(){

        getAccessToken();
    });
  };


  // Retrieves an acccess token
  function getAccessToken(){
      Office.context.mailbox.getCallbackTokenAsync(exchangeTokenCallback);
  }

  function exchangeTokenCallback(asyncResult, userContext) {
        if (asyncResult.status === "succeeded") {

            // get info about selected mail message...
            var item = Office.cast.item.toItemRead(Office.context.mailbox.item);
            var email = Office.context.mailbox.userProfile.emailAddress;
            var loginToken = asyncResult.value;


            $.ajax({
                  headers: {"X-Outlook-Token-For-EWS":loginToken,
                            "X-Outlook-EwsUrl":Office.context.mailbox.ewsUrl,
                            "X-Outlook-ItemId": item.itemId
                  },
                  url: "/ac/api/email/ews"
                }).done(function(result) {

                    jQuery('#result').text(JSON.stringify(result));

                }).error(function(result) {

                    jQuery('#result').text(JSON.stringify(result));

                });

        } else {
            showToast("Error", "Could not get callback token: " + asyncResult.error.message);
        }
    };


})();
服务使用这个Java代码来获取项目(
params
对象包含我在上面javascript的标题中发布的信息):

我希望有更多经验的人能为我指明正确的方向。

我在ews java api中找到了一个正确的方向。我错误地使用了“TokenCredentials”,因为它不支持OAuth登录。ews java api完全支持使用OAuth令牌登录。幸运的是,我们可以在请求中传递http头,因此这对我很有用:

service.getHttpHeaders().put("Authorization", "Bearer " + params.getAccessToken());
除此之外,我不再需要使用
setCredentials
方法设置凭据

service.getHttpHeaders().put("Authorization", "Bearer " + params.getAccessToken());