API Office365 - доступ администратора к событиям календаря других пользователей / комнаты

Нажав на этот запрос: https://outlook.office365.com/api/v1.0/users/room@email.com/events в браузере, я могу ввести свое имя пользователя и пароль администратора и получить события календаря для этой конкретной комнаты. Однако, когда я пытаюсь сделать этот вызов из собственного приложения с аутентификацией администратора, я получаю следующий ответ:reason = "Вызов должен получить доступ к почтовому ящику, указанному в маркере oauth."; Error_category="invalid_grant" Как я могу получить события календаря для конкретная комната аутентифицирована как админ?

2 ответа

Решение

В настоящее время мы разрешаем доступ только к почте, календарю и контактам, принадлежащим аутентифицированному пользователю. Итак, ваш сценарий доступа администратора к конф. Календарь комнат в настоящее время не поддерживается. Доступ к ресурсам, принадлежащим другим пользователям, например, конф. Календарь комнат включен в нашу дорожную карту для поддержки, но у нас пока нет времени, чтобы поделиться с вами.

А пока у вас есть два варианта.

Вариант № 1. Если вы можете запустить приложение на сервере, вы можете создать приложение-службу, которое требует согласия администратора, но имеет право доступа к любому почтовому ящику в клиенте Office 365. Вам нужно будет заставить ваше собственное приложение общаться с приложением, работающим на сервере. Смотрите этот блог для более подробной информации.

Вариант № 2: Вы можете использовать наш SOAP API Exchange Web Services для реализации вашего сценария. См. Общие календари Office 365 для получения дополнительной информации об этой опции и соответствующих ссылках.

Этот небольшой Java-класс PLUG-N-COMPILE-RUN (woo-hoo!) Должен продемонстрировать доступ к календарю событий пользователя комнаты. API REST Azure V2.0 в настоящее время не позволяет этого делать. Убедитесь, что пользователь авторизации, который проходит аутентификацию в службе Exchange, является "делегатом" (или) календаря пользователя ресурса комнаты, события которого вы хотите получить. Возможно, вашему администратору Exchange/Office365 это нужно настроить. Я взял Java EWS API здесь: http://central.maven.org/maven2/com/microsoft/ews-java-api/ews-java-api/2.0/ ews-java-api-2.0.jar и javadoc.jar, который был отличным справочником, Вы также можете использовать Maven, Gradle или другие методы для интеграции API в ваш код, если зайдете в репозиторий Github: https://github.com/OfficeDev/ews-java-api. Руководство по началу работы... ну... слова ускользают от меня (по уважительной причине). Проще говоря, вам лучше немного использовать свою поисковую систему, чтобы понять, как делать другие вещи! И просмотр классов в Javadoc мне очень помог. Хватит бла-бла-бла... Далее к коду: (о, я включил все операции импорта! Я всегда ненавижу это, когда получаю образец фрагмента кода, и мне приходится охотиться и клевать импорт. Я до сих пор оставьте это для вас, чтобы подключить настоящие библиотеки, хотя! Вы больше не в подгузниках кода, если вы можете получить это далеко!;-)

package com.on.and.play

import java.net.URI;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.text.DateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.text.SimpleDateFormat

import microsoft.exchange.webservices.data.core.service.item.Appointment;
import microsoft.exchange.webservices.data.core.service.schema.AppointmentSchema;
import microsoft.exchange.webservices.data.core.service.folder.CalendarFolder;
import microsoft.exchange.webservices.data.search.CalendarView;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.search.FindItemsResults;
import microsoft.exchange.webservices.data.property.complex.FolderId;
import microsoft.exchange.webservices.data.search.FolderView
import microsoft.exchange.webservices.data.core.service.schema.FolderSchema
import microsoft.exchange.webservices.data.search.FindFoldersResults
import microsoft.exchange.webservices.data.search.filter.SearchFilter
import microsoft.exchange.webservices.data.core.enumeration.search.FolderTraversal
import microsoft.exchange.webservices.data.core.service.item.Item;
import microsoft.exchange.webservices.data.core.service.schema.ItemSchema;
import microsoft.exchange.webservices.data.property.complex.Mailbox
import microsoft.exchange.webservices.data.search.ItemView;
import microsoft.exchange.webservices.data.core.PropertySet;
import microsoft.exchange.webservices.data.property.definition.PropertyDefinition
import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
import microsoft.exchange.webservices.data.core.enumeration.property.BasePropertySet;
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException
import java.net.URI;

class MyTestService {
  public List getRoomCalendar() {       
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
    // replace somebodyreal@somewhere.com with a real email address that is
    // a delegate of ConferenceRoom@somewhere.com. Your exchange admin may  
    // need to set that up for you. 
    ExchangeCredentials credentials 
        = new WebCredentials("somebodyreal@somewhere.com",
                             "their_plain_text_password_God_bless_Microsoft");
    service.setCredentials(credentials);
    service.setUrl(new URI("https://outlook.office365.com/EWS/Exchange.asmx"));
    // service.autodiscoverUrl("toddp@touchsource.com", );
    FolderView fv = new FolderView(100);
    fv.setTraversal(FolderTraversal.Deep);
    // replace ConferenceRoom@somewhere.com with your resource's email address 
    FolderId confRoomFolderId = new FolderId(WellKnownFolderName.Calendar, 
                                             new Mailbox("ConferenceRoom@somewhere.com"));
    List apntmtDataList = new ArrayList();          
    Calendar now = Calendar.getInstance();
    Date startDate = Calendar.getInstance().getTime();
    now.add(Calendar.DATE, 30);
    Date endDate = now.getTime();
    try {
      CalendarFolder calendarFolder = CalendarFolder.bind(service, confRoomFolderId);
      CalendarView cView = new CalendarView(startDate, endDate, 5);
      cView.setPropertySet(new PropertySet(AppointmentSchema.Subject, 
                                           AppointmentSchema.Start,
                                           AppointmentSchema.End));
      // we can set other properties as well depending upon our need.
      FindItemsResults appointments = calendarFolder.findAppointments(cView);
      List appList = appointments.getItems();
      for (Appointment appointment : appList) {
        Map appointmentData = new HashMap();
        appointmentData = readAppointment(appointment);
        apntmtDataList.add(appointmentData);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    return apntmtDataList;
  } 

  public Map readAppointment(Appointment appointment) {
    Map appointmentData = new HashMap();
    try {
      DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
      appointmentData.put("appointmentItemId", appointment.getId().toString());
      appointmentData.put("appointmentSubject", appointment.getSubject());
      appointmentData.put("appointmentStartTime", df.format(appointment.getStart()));
      appointmentData.put("appointmentEndTime", df.format(appointment.getEnd()));
    } catch (ServiceLocalException e) {
      e.printStackTrace();
    }       
    return appointmentData;
  }
}
Другие вопросы по тегам