Используйте Office 365 REST API без пользовательского интерфейса


Мне нужно ввести записи календаря в учетную запись Outlook клиента. Это довольно прямолинейно с обменом. Вы просто аутентифицируетесь с пользователем, который имеет доступ, а затем можете отправлять записи в учетные записи других пользователей. В Office 365 все выглядит совершенно иначе.

Я попытался следовать инструкциям здесь: https://dev.outlook.com/restapi/getstarted

Я создал приложение и получил идентификатор клиента приложения. Но вся документация находится вокруг oAuth. Вообще говоря, oAuth предназначен для сценариев, когда пользователю необходимо ввести свои учетные данные через окно браузера,которое затем подтвердит пользователю, какие учетные данные они готовы разрешить приложению.

Это не соответствует моему сценарию. Мне нужно иметь возможность вставлять записи календаря в учетную запись без какого-либо пользовательского интерфейса. Это внутренняя интеграция. Он просто должен делать свою работу молча.

Я посмотрел на этот образец апп: https://github.com/OfficeDev/O365-Win-Snippets

Но, это приложение переднего плана. Когда ему требуется аутентификация, он открывает окно, чтобы заставить пользователя ввести свои учетные данные.

Когда я пытаюсь вызвать REST API, упомянутый на странице начало работы, он возвращает HTML. Это URL-адрес его упоминания:

Https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F&response_type=code&scope=https%3A%2F%2Foutlook.office.com%2Fmail.read

Я попробовал несколько перестановок этого Url с моим идентификатором клиента. Я попытался передать свои учетные данные Office 365 с помощью обычной проверки подлинности http.

Я застрял.

3 3

3 ответа:

Ответ прост. Используйте API Exchange, а не Office 365.

Я был сбит с толку, потому что предполагал, что Office 365-это другая сущность для Exchange, но сервер электронной почты Office 365-это просто один гигантский сервер Exchange. Вот некоторые примеры кода для хорошей меры. Это пример входа на сервер Exchange Office 365 и отправки записи календаря на адрес электронной почты. Простой.

Я сделал дикую догадку о Url-адресе exchange, и это было правильный: https://outlook.office365.com/ews/exchange.asmx

    //Connect to exchange
    var ewsProxy = new ExchangeService(ExchangeVersion.Exchange2013);
    ewsProxy.Url = new Uri("https://outlook.office365.com/ews/exchange.asmx");

    //Create the meeting
    var meeting = new Appointment(ewsProxy);

    ewsProxy.Credentials = new NetworkCredential(_Username, _Password);
    meeting.RequiredAttendees.Add(_Recipient);

    // Set the properties on the meeting object to create the meeting.
    meeting.Subject = "Meeting";
    meeting.Body = "Please go to the meeting.";
    meeting.Start = DateTime.Now.AddHours(1);
    meeting.End = DateTime.Now.AddHours(2);
    meeting.Location = "Location";
    meeting.ReminderMinutesBeforeStart = 60;

    // Save the meeting to the Calendar folder and send the meeting request.
    meeting.Save(SendInvitationsMode.SendToAllAndSaveCopy); 

Я понимаю, что это возможно, но аутентификация выглядит довольно сложной. Во-первых, любое приложение, требующее интеграции с Office 365, должно также интегрироваться с соответствующей Azure AD. Вы можете зарегистрировать приложение для определенных пользователей, чтобы оно имело разрешения, необходимые для выполнения любых операций. Смотрите здесь для хорошего резюме этого компонента: https://msdn.microsoft.com/en-us/office/office365/howto/connect-your-app-to-o365-app-launcher?f=255&MSPPError=-2147217396#section_2

Для аутентификации требуется модель приложения демон / сервер. Я еще не пытался это сделать, но это описано здесь и похоже, что это должно удовлетворить ваши потребности (см. раздел демон или серверное приложение к веб-API): https://azure.microsoft.com/en-us/documentation/articles/active-directory-authentication-scenarios/#daemon-or-server-application-to-web-api

Для вызова API REST Office 365 приложению требуется маркер доступа из Azure Active Directory, поэтому необходимо (обязательно) зарегистрировать приложение в Microsoft Azure Active Directory (Azure AD). Ваша учетная запись Office 365, в свою очередь, должна быть связана с Azure AD. В этом ответе кратко описывается, как зарегистрировать приложение в Azure AD для использования API Office 365.

Basic схема аутентификации

Перегруппировка Basic аутентификация, в настоящее время это is enabled for API version 1.0, в следующем примере показано, как использоватьOutlook Calendar REST API в приложении .NET.

Предварительные условия:

domain: https://outlook.office365.com/
API version: v1.0

Вот пример, который получает мои календари и печатает их названия

private static async Task ReadCalendars()
{
    var handler = new HttpClientHandler();
    handler.Credentials = new NetworkCredential()
    {
        UserName = ConfigurationManager.AppSettings["UserName"],
        Password = ConfigurationManager.AppSettings["Password"]
    };

    using (var client = new HttpClient(handler))
    {
        var url = "https://outlook.office365.com/api/v1.0/me/calendars";
        var result = await client.GetStringAsync(url);

        var data = JObject.Parse(result);
        foreach (var item in data["value"])
        {
            Console.WriteLine(item["Name"]);
        }
    }
}