Получайте календарные расписания с Graph API от сервиса C# - PullRequest
1 голос
/ 22 апреля 2020

Мне нужно использовать Microsoft Graph API для получения графиков занятости из календаря с помощью службы. NET Core Windows. Согласно собственной документации Microsoft, я должен использовать следующее:

GraphServiceClient graphClient = new GraphServiceClient( authProvider );

var schedules = new List<String>()
{
    "adelev@contoso.onmicrosoft.com",
    "meganb@contoso.onmicrosoft.com"
};

var startTime = new DateTimeTimeZone
{
    DateTime = "2019-03-15T09:00:00",
    TimeZone = "Pacific Standard Time"
};

var endTime = new DateTimeTimeZone
{
    DateTime = "2019-03-15T18:00:00",
    TimeZone = "Pacific Standard Time"
};

var availabilityViewInterval = 60;

await graphClient.Me.Calendar
    .GetSchedule(schedules,endTime,startTime,availabilityViewInterval)
    .Request()
    .Header("Prefer","outlook.timezone=\"Pacific Standard Time\"")
    .PostAsync();

Я зарегистрировал новое приложение на портале Azure и дал ему разрешение Calendars.Read.

My C# code:

try
{
    IConfidentialClientApplication clientApplication = ConfidentialClientApplicationBuilder
        .Create(_clientId)
        .WithTenantId(_tenantId)
        .WithClientSecret(_clientSecret)
        .Build();

    var authProvider = new ClientCredentialProvider(clientApplication);
    var graphClient = new GraphServiceClient(authProvider);

    var schedules = new List<string>
    {
        "example@mail.com" // not actual mail used in my application
    };

    var startTime = new DateTimeTimeZone
    {
        DateTime = "2020-04-18T00:00:00",
        TimeZone = "Europe/Paris"
    };

    var endTime = new DateTimeTimeZone
    {
        DateTime = "2020-04-25T23:59:59",
        TimeZone = "Europe/Paris"
    };

    ICalendarGetScheduleCollectionPage scheduleList = await graphClient.Me.Calendar
        .GetSchedule(schedules, endTime, startTime, 60)
        .Request()
        .PostAsync().ConfigureAwait(false);
    Console.WriteLine("scheduleList.Count: " + scheduleList.ToList().Count);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

Когда я запускаю свое приложение, я получаю следующее исключение:

Код: BadRequest

Сообщение: текущий контекст аутентификации недопустим для этого запроса. Это происходит, когда запрос сделан к конечной точке, которая требует входа пользователя. Например, для / me требуется зарегистрированный пользователь. Получите токен от имени пользователя для отправки запросов к этим конечным точкам. Используйте поток кода авторизации OAuth 2.0 для мобильных и собственных приложений и неявный поток OAuth 2.0 для одностраничных веб-приложений.

1 Ответ

2 голосов
/ 22 апреля 2020

Вы используете Поставщик учетных данных клиента для создания authProvider.

Однако учетные данные клиента работают только для разрешений только для приложений.

Но в вашем коде graphClient.Me.Calendar означает, что вы пытаетесь получить «мой календарь», говоря, что это календарь вошедшего в систему пользователя.

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

Таким образом, вам нужно реализовать Код авторизации провайдера , если у вас есть зарегистрированный пользователь. Затем вы можете использовать graphClient.Me.Calendar для получения календаря.

Или, если у вас нет зарегистрированного пользователя, вы должны продолжать использовать поставщика учетных данных клиента и изменить код следующим образом: graphClient.Users["objectId of the user"].Calendar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...