Не удается обновить profilePhoto с помощью Microsoft Graph API

Я могу нормально получать фотографии профиля, но сталкиваюсь с ошибкой ErrorAccessDenied при попытке обновить фотографии. Согласно этому:

https://graph.microsoft.io/en-us/docs/api-reference/v1.0/api/profilephoto_update

Должно быть достаточно разрешения User.ReadWrite. Я назначил своему приложению эту привилегию с помощью manage.windowsazure.com (а также пытался предоставить все виды других привилегий), но все равно получаю ошибку. Вот текущий набор привилегий, которые я предоставил приложению:

Directory.AccessAsUser.All Directory.Read.All Directory.ReadWrite.All email Group.Read.All Group.ReadWrite.All MailboxSettings.ReadWrite offline_access profile User.Read User.Read.All User.ReadBasic.All User.ReadWrite User.ReadWrite.All

Я получаю токен Bearer с потоком client_credentials следующим образом:

curl -d grant_type=client_credentials \
     -d client_id=CLIENT_ID \
     -d client_secret=CLIENT_SECRET
     -d resource=https://graph.microsoft.com \
     https://login.microsoftonline.com/DOMAINNAME/oauth2/token

Затем я пытаюсь обновить фотографию профиля следующим образом:

curl -H "Authorization: Bearer BEARERTOKEN" \
     --request PATCH \
     -H "Content-Type: image/jpeg" \
     -d @photo.jpg
     https://graph.microsoft.com/v1.0/users/USERPRINCIPALNAME/photo/\$value

И я получаю следующую ошибку:

{
  "error": {
    "code": "ErrorAccessDenied",
    "message": "Access is denied. Check credentials and try again.",
    "innerError": {
      "request-id": "REQUESTID",
      "date": "2016-05-23T16:42:21"
    }
  }
}

person kartik_subbarao    schedule 23.05.2016    source источник


Ответы (1)


Похоже, вы указали делегированные разрешения, настроенные для вашего приложения, но получили токен с помощью потока учетных данных клиента, который использует отдельные разрешения приложения. Согласно странице документации, на которую вы ссылались, областью, необходимой для обновления фотографии профиля пользователя, является User.ReadWrite. Это невозможно сделать с областями только для приложений, включая User.ReadWrite.All. Фото пользователя можно обновить с помощью потока предоставления кода авторизации (см. https://graph.microsoft.io/en-us/docs/authorization/app_authorization)

person Marek Rycharski    schedule 23.05.2016
comment
Извините за путаницу User.ReadWrite.All и User.ReadWrite, я исправил свой пост. Можете ли вы указать мне, где говорится, что фотография профиля не может быть обновлена ​​только для приложений? Если это так, то это действительно мешает работе. Это приложение должно иметь возможность обновлять фотографии людей как отдельный процесс, без взаимодействия с конечным пользователем через коды авторизации или что-то в этом роде. Предпосылкой для этого является то, что процесс синхронизации AAD не обеспечивает надежного обновления фотографий для пользователей, поэтому мы пытаемся настроить для этого отдельный процесс. - person kartik_subbarao; 24.05.2016
comment
О, теперь, кажется, я понял. User.ReadWrite — это делегированное разрешение, а не разрешение приложения. И это единственная разрешенная область, которая задокументирована на этой странице выше для обновления фотографий. Смущало то, что я прекрасно читал фотографии. Но причина этого в том, что метод GET также поддерживает области разрешений приложений, такие как User.ReadWrite.All. (И они задокументированы на соответствующей странице). Похоже, мне придется пересмотреть весь этот подход. - person kartik_subbarao; 24.05.2016