2016-11-22 1 views
2

Я создаю надстройку Outlook, и я пытаюсь «загрузить» текущий выбранный элемент (= почтовое сообщение) с помощью API-интерфейсов EWS Java используя токен входа. Следующий шаг - получение вложений и обработка их на нашем системном сервере.Использовать маркер надстройки Outlook, чтобы получить текущий сервер товаров с API-интерфейсом EWS.

Я следую за dev doc, где я использую метод mailbox.getCallbackTokenAsync для извлечения маркера входа. Я отправляю этот токен на наш сервер (который также обслуживает надстройку) и использует EWS Java Api для извлечения текущего выбранного элемента.

Но я не могу войти в систему с токеном. Исключение я получаю это серверный The remote server returned an error: (401)Unauthorized

В оном в знаке Я ​​использую следующий код яваскрипта, чтобы позвонить в нашем сервисе:

(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 выше):

package nl.c2c.ac.api.service.email.outlookaddin; 

import java.net.URI; 

import microsoft.exchange.webservices.data.core.ExchangeService; 
import microsoft.exchange.webservices.data.core.PropertySet; 
import microsoft.exchange.webservices.data.core.service.item.Item; 
import microsoft.exchange.webservices.data.credential.TokenCredentials; 
import microsoft.exchange.webservices.data.property.complex.ItemId; 
import nl.c2c.ac.exceptions.CustomException; 

public class EmailOutlookAddinService { 

    private EmailOutlookAddinParams params; 

    public EmailOutlookAddinService(EmailOutlookAddinParams params){ 
     setParams(params); 
    } 

    public String retrieveMessage() throws Exception{ 
     ExchangeService service = null; 
     try { 


      TokenCredentials credentials = new TokenCredentials(params.getAccessToken()); 
      service = new ExchangeService(); 
      service.setCredentials(credentials); 
      service.setUrl(new URI(params.getEwsUrl())); //new URI("https://outlook.office365.com/EWS/Exchange.asmx") 


      Item itm = service.bindToItem(new ItemId(params.getItemId()), PropertySet.getIdOnly()); 
      return "Subject: " + itm.getSubject(); 

     }catch(Throwable e){ 
      throw new CustomException(e); 
     } finally { 
      if(service!=null){ 
       service.close(); 
      } 
     } 


    } 

    private void setParams(EmailOutlookAddinParams params) { 
     this.params = params; 
    } 
} 

Я надеюсь, что кто-то с большим опытом может мне точку в правильном направлении.

ответ

2

Я нашел issue ews-java-api, который указал мне прямо справа. Я неправильно использовал «TokenCredentials», потому что он не поддерживает логины OAuth. В ews java api есть not yet полная поддержка входа с использованием токена OAuth. К счастью, мы можем передать заголовки HTTP в запросе, так что это работает для меня:

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

Наряду с этим я больше не нужно устанавливать учетные данные с setCredentials методом.