API de Office365 – Acceso de administrador a eventos de calendario de otros usuarios / salas

Al hacer clic en esta solicitud: https://outlook.office365.com/api/v1.0/users/room@email.com/events en un navegador, puedo ingresar mi nombre de usuario y contraseña de administrador y obtener Eventos de calendario para esa habitación específica. Sin embargo, cuando bash realizar esta llamada desde una aplicación nativa con el administrador autenticado obtengo esta respuesta: reason = “La llamada debe acceder al buzón especificado en el token oauth”; error_category = “invalid_grant” ¿Cómo puedo obtener eventos del calendario para un habitación específica autenticada como el administrador?

    Actualmente, solo permitimos el acceso al correo, el calendario y los contactos que pertenecen al usuario autenticado. Entonces, su escenario de un administrador accediendo al conf. el calendario de la sala no es compatible en este momento. El acceso a los recursos que pertenecen a otros usuarios, por ejemplo, conf. el calendario de la sala está en nuestra hoja de ruta para soporte, pero aún no tenemos un marco de tiempo para compartir con usted.

    Mientras tanto, tienes dos opciones.

    Opción n.º 1: si puede ejecutar la aplicación en un servidor, puede crear una aplicación de servicio que requiera el consentimiento del administrador, pero está autorizada para acceder a cualquier buzón del inquilino de Office 365. Tendrá que hacer que su aplicación nativa hable con la aplicación que se ejecuta en el servidor. Mira este blog para más detalles.

    Opción n.º 2: puede usar nuestra API de SOAP de servicios web de Exchange para implementar su escenario. Consulte los calendarios compartidos de Office 365 para obtener más detalles sobre esta opción y enlaces relevantes.

    Esta pequeña clase de Java PLUG-N-COMPILE-RUN (woo-hoo!) Debería demo para llegar a un calendario de eventos de usuario de recursos de sala. La API REST de Azure V2.0 no permite que uno lo haga. Asegúrese de que el usuario de autenticación que se autentica en el servicio de Exchange es un “delegado” al (o de) el calendario de usuario del recurso de sala cuyos eventos desea recuperar. Es posible que su administrador de Exchange / Office365 deba configurarlo para usted. Agarré la API de Java EWS aquí: Índice de /maven2/com/microsoft/ews-java-api/ews-java-api/2.0/ ews-java-api-2.0.jar y el javadoc.jar que fue una gran referencia . También puede usar Maven, Gradle u otros métodos para integrar la API en su código si va al repository de Github: https://github.com/OfficeDev/ews-java-api . La Guía de introducción es … bueno … las palabras se escapan de mí (por una buena razón). ¡Ponlo de esta manera, será mejor que uses tu buscador un poco para descubrir cómo hacer otras cosas! Y mirando a través de las clases en el Javadoc me ayudó mucho. Suficiente blah-blah-blah … En el código: (¡oh, incluí todas las importaciones! Siempre odio cuando obtengo un fragmento de código de muestra y tengo que ir a cazar y picotear para las importaciones. Todavía ¡deja que te conectes con las bibliotecas reales, ya no estás en pañales de código, si puedes llegar tan lejos! 😉

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