Демон Microsoft Graph API - ошибка: ResourceNotFound Сообщение: ресурс не может быть обнаружен - PullRequest
1 голос
/ 14 января 2020

Я пытаюсь создать демон, используя Microsoft Graph API v1.0. Я зарегистрировал свое приложение с разрешениями приложения Calendars.ReadWrite и User.Read.All с предоставленным согласием администратора. Я правильно получаю токен доступа и вызываю GetUserId, который возвращает идентификатор пользователя для установки requestURI. После этого я хочу получить календарь Outlook:

var id = await GetUserId(result.AccessToken);

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

String requestURI = $"https://graph.microsoft.com/v1.0/users/{id}/calendars";

var response = await httpClient.GetAsync(requestURI);
var responseString = await response.Content.ReadAsStringAsync();

, но получаю эту ошибку:

{
  "error": {
    "code": "ResourceNotFound",
    "message": "Resource could not be discovered.",
    "innerError": {
      "request-id": "5ecd547b-9281-4824-94e5-095691e759aa",
      "date": "2020-01-14T16:44:16"
    }
  }
}

Когда я устанавливаю requestURI в users/{id} или organization, запрос работает хорошо, но добавление /calendars, /events или /mailFolder приводит к вышеуказанной ошибке.

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

Обновление: код для получения токена:

app = ConfidentialClientApplicationBuilder
    .Create(ClientId)
    .WithClientSecret(ClientSecret)
    .WithAuthority($"https://login.microsoftonline.com/{TenantId}/oauth2/v2.0/token&grant_type=client_credentials&resource=https://graph.microsoft.com")
    .Build();
string[] scopesClient =
    new string[] { $"https://graph.microsoft.com/.default" };
AuthenticationResult result = null;
try
{
    result = await app.AcquireTokenForClient(scopesClient).ExecuteAsync();
}
catch (MsalServiceException ex) when(ex.Message.Contains("AADSTS70011"))
{

}

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Вы Authority не совсем правы:

  1. resource=https://graph.microsoft.com является устаревшим параметром и не используется для конечной точки v2 (то есть аутентификация с помощью Scopes, а не Resources) .

  2. ConfidentialClientApplicationBuilderhandes, автоматически устанавливающий OAuth Grant, поэтому указывать grant_type=client_credentials не требуется.

  3. Орган должен содержать только полномочия аутентификации (https://login.microsoftonline.com/) и идентификатор арендатора. Самый простой способ справиться с этим - использовать перечисление AzureCloudInstance.AzurePublic

Ваш код токена должен выглядеть примерно так:

app = ConfidentialClientApplicationBuilder
    .Create(ClientId)
    .WithClientSecret(ClientSecret)
    .WithAuthority(AzureCloudInstance.AzurePublic, TenantId)
    .Build();

string[] scopes = new string[] { "https://graph.microsoft.com/.default" };

AuthenticationResult result = null;
try
{
    result = await app
        .AcquireTokenForClient(scopes)
        .ExecuteAsync();
}
catch (MsalServiceException ex)
{

}

Примечание. Вы не сможете использовать этот метод с учетной записью @outlook.com. Личные учетные записи не поддерживают client_credentials.

0 голосов
/ 14 января 2020

enter image description here В документации указано, что необходимо добавить CalenderRead и CalenderReadWrite. Если нет, я бы использовал делегированное разрешение, если вы используете личный кабинет. Я также go отправлю ms.jwt, где они проверяют ваш токен и сообщают вам, какое у вас есть разрешение и что вам нужно, для вызова конечных точек календаря

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