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;
}
}