Проблема авторизации API Microsoft Graph с конкретными конечными точками (например, / календари) - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь использовать связанные с календарем конечные точки Microsoft Graph API. Я зарегистрировал свое приложение в Azure AD и настроил его разрешения (фактически, я добавил весь список разрешений приложений для Microsoft Graph API просто для того, чтобы убедиться в этом)

Вы можете увидеть мой токен доступа ниже, хотя он немного длинен. jwt.ms также утверждает, что это токен Azure AD V1.

{
  "typ": "JWT",
  "nonce": "AQABAAAAAAC5una0EUFgTIF8ElaxtWjTfuFEc1xDrKW9OgoxxfapaiuriahgH-pwN7wMt0tMrHmt-nOLiWJm7xzuNTM9Un0NoRzBP_Yor0wOmspcQdql0SAA",
  "alg": "RS256",
  "x5t": "wULmYfsqdQuWtV_-hxVtDJJZM4Q",
  "kid": "wULmYfsqdQuWtV_-hxVtDJJZM4Q"
}.{
  "aud": "https://graph.microsoft.com",
  "iss": "https://sts.windows.net/41dad557-6060-410f-a612-368cf36641f0/",
  "iat": 1541058963,
  "nbf": 1541058963,
  "exp": 1541062863,
  "aio": "42RgYDicbl/RHqaT8XTWla+XJ8j2AgA=",
  "app_displayname": "GraphChatBotTest",
  "appid": "36602029-65b0-44ee-a2bb-f18c0f154969",
  "appidacr": "1",
  "idp": "https://sts.windows.net/41dad557-6060-410f-a612-368cf36641f0/",
  "oid": "ea391d2a-9e85-4387-99ba-68a28d077a65",
  "roles": [
    "Chat.UpdatePolicyViolation.All",
    "Calls.JoinGroupCall.All",
    "EduRoster.Read.All",
    "OnlineMeetings.Read.All",
    "Mail.ReadWrite",
    "OnlineMeetings.ReadWrite.All",
    "Device.ReadWrite.All",
    "User.ReadWrite.All",
    "Domain.ReadWrite.All",
    "Application.ReadWrite.OwnedBy",
    "SecurityEvents.Read.All",
    "Calendars.Read",
    "EduAssignments.ReadWrite.All",
    "People.Read.All",
    "Application.ReadWrite.All",
    "Calls.InitiateGroupCall.All",
    "Group.Read.All",
    "Directory.ReadWrite.All",
    "EduAssignments.ReadWriteBasic.All",
    "MailboxSettings.Read",
    "EduAdministration.Read.All",
    "Calls.JoinGroupCallAsGuest.All",
    "Sites.Read.All",
    "Sites.ReadWrite.All",
    "Contacts.ReadWrite",
    "Group.ReadWrite.All",
    "Sites.Manage.All",
    "SecurityEvents.ReadWrite.All",
    "Notes.Read.All",
    "User.Invite.All",
    "EduRoster.ReadWrite.All",
    "Files.ReadWrite.All",
    "Directory.Read.All",
    "User.Read.All",
    "EduAssignments.ReadBasic.All",
    "EduRoster.ReadBasic.All",
    "Files.Read.All",
    "Mail.Read",
    "Chat.Read.All",
    "ChannelMessage.Read.All",
    "EduAssignments.Read.All",
    "Calendars.ReadWrite",
    "identityriskyuser.read.all",
    "EduAdministration.ReadWrite.All",
    "Mail.Send",
    "ChannelMessage.UpdatePolicyViolation.All",
    "MailboxSettings.ReadWrite",
    "Contacts.Read",
    "IdentityRiskEvent.Read.All",
    "AuditLog.Read.All",
    "Member.Read.Hidden",
    "Calls.AccessMedia.All",
    "Sites.FullControl.All",
    "Reports.Read.All",
    "Calls.Initiate.All",
    "Notes.ReadWrite.All"
  ],
  "sub": "ea391d2a-9e85-4387-99ba-68a28d077a65",
  "tid": "41dad557-6060-410f-a612-368cf36641f0",
  "uti": "Vy3Z7a_gLEODSO81X4cLAA",
  "ver": "1.0",
  "xms_tcdt": 1487855898
}.[Signature]

Теперь, когда я использую конечные точки пользователя и группы, все работает нормально. Я могу получить всех пользователей, конкретного пользователя и то же самое относится к группам. Однако всякий раз, когда я пытаюсь использовать некоторые другие конечные точки, такие как / календари или события, я получаю 401 Несанкционированный ответ с кодом «Неизвестная ошибка».

{
  "error": {
    "code": "UnknownError",
    "message": "",
    "innerError": {
      "request-id": "532d3476-b41b-4d8a-a0ed-b44367c16d7f",
      "date": "2018-11-01T08:19:55"
    }
  }
}

Для справки, я пробовал и конечные точки v1.0, и конечные точки бета-тестирования с одинаковыми результатами. Согласно документации API, эти конечные точки (/calendars, /events и т. Д.) Должны быть доступны с необходимыми разрешениями приложения. В чем может быть проблема здесь? Любая помощь приветствуется.

Редактировать: добавление примера кода, чтобы показать, как я вызываю API

var uri = 
    $"https://graph.microsoft.com/v1.0/users/{userId}/events";
HttpClient.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", accessToken);
var response = await HttpClient.GetAsync(uri);

Кроме того, когда я вызываю ту же конечную точку из обозревателя графиков (вошел в систему со своей личной учетной записью), я получаю успешный ответ.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Когда мы регистрируем приложение с портала регистрации приложений (https://apps.dev.microsoft.com) вместо портала Azure, происходит нечто забавное. Я могу успешно получить токен доступа, но когда я использую новое приложение для вызова /users, я получаю ошибку Authorization_IdentityNotFound, тогда как при вызове /events я получаю UnknownError. Приложение получило следующие разрешения: Calendars.ReadWrite, User.Read.All, Group.Read.All. Возможно, еще важнее то, что это новое приложение не отображается на лазурном портале. Ни для меня, ни для админа. Надеюсь, это поможет пролить больше света на этот вопрос.

Редактирование последнего редактирования:

Оказывается, у приложения, которое я создал на Портале регистрации приложений, был другой клиент. После изменения идентификатора клиента для конечной точки /token я смог получить успешный ответ при вызове /events и /users. Все еще задаюсь вопросом, какова причина оригинальной проблемы.

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