API Office365 – Amministratore che accede a eventi di calendario di altri utenti / stanze

Colpendo questa richiesta: https://outlook.office365.com/api/v1.0/users/[email protected]/events in un browser posso inserire il nome utente e la password dell’amministratore e ottenere gli eventi del calendario per quella stanza specifica. Tuttavia quando provo a fare questa chiamata da un’app nativa con l’amministratore autenticato ottengo questa risposta: reason = “La chiamata deve accedere alla casella di posta specificata nel token oauth.”; Error_category = “invalid_grant” Come posso ottenere eventi di calendario per un stanza specifica autenticata come amministratore?

Al momento consentiamo solo l’accesso a posta, calendario e contatti appartenenti all’utente autenticato. Quindi, lo scenario di un amministratore che accede al conf. il calendario della stanza non è supportato in questo momento. Accesso alle risorse appartenenti ad altri utenti es. Conf. il calendario delle camere è sulla nostra tabella di marcia per il supporto, ma non abbiamo ancora un calendario da condividere con voi.

Nel frattempo, hai due opzioni.

Opzione n. 1: se è ansible eseguire l’app su un server, è ansible creare un’app di servizio che richiede il consenso dell’amministratore, ma è autorizzata ad accedere a qualsiasi cassetta postale nel tenant di Office 365. Dovrai fare in modo che l’app nativa parli con l’app in esecuzione sul server. Vedi questo blog per maggiori dettagli.

Opzione n. 2: è ansible utilizzare l’API SOAP dei servizi Web di Exchange per implementare lo scenario. Consulta i calendari condivisi di Office 365 per maggiori dettagli su questa opzione e sui link pertinenti.

Questa piccola class Java PLUG-N-COMPILE-RUN (woo-hoo!) Dovrebbe dimostrare di essere in grado di accedere a un calendario di eventi utente di una stanza. L’API REST di Azure V2.0 non consente attualmente di farlo. Assicurati che l’utente autenticato che autentica il servizio di Exchange sia un “delegato” al (o al) calendario utente delle risorse della stanza di cui desideri recuperare gli eventi. L’amministratore di Exchange / Office365 potrebbe aver bisogno di configurarlo per te. Ho afferrato l’API Java EWS qui: Indice di /maven2/com/microsoft/ews-java-api/ews-java-api/2.0/ ews -java-api-2.0.jar e javadoc.jar che era un ottimo riferimento . Puoi anche utilizzare Maven, Gradle o altri metodi per integrare l’API nel tuo codice se vai al repository Github: https://github.com/OfficeDev/ews-java-api . La Guida introduttiva è … beh … le parole mi sfuggono (per una buona ragione). Mettilo in questo modo, faresti meglio a usare il tuo motore di ricerca un po ‘per capire come fare altre cose! E guardare attraverso i corsi del Javadoc mi ha aiutato molto. Basta bla-bla-bla … Al codice: (oh, ho incluso tutte le importazioni! Odio sempre quando ottengo un frammento di codice di esempio e devo andare a cacciare e becchettare per le importazioni. lascia fare a te per essere collegato alle librerie reali, però! Non sei più nei pannolini di codice, se puoi arrivare così lontano! 😉

 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 [email protected] with a real email address that is // a delegate of [email protected] Your exchange admin may // need to set that up for you. ExchangeCredentials credentials = new WebCredentials("[email protected]", "their_plain_text_password_God_bless_Microsoft"); service.setCredentials(credentials); service.setUrl(new URI("https://outlook.office365.com/EWS/Exchange.asmx")); // service.autodiscoverUrl("[email protected]", ); FolderView fv = new FolderView(100); fv.setTraversal(FolderTraversal.Deep); // replace [email protected] with your resource's email address FolderId confRoomFolderId = new FolderId(WellKnownFolderName.Calendar, new Mailbox("[email protected]")); 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; } }