Получение 401-Unauthorized при получении фотографии с использованием Outlook REST API - java cliet

Я пытаюсь получить фотографию пользователя с помощью Outlook REST API(https://msdn.microsoft.com/en-us/office/office365/api/photo-rest-operations#UserphotooperationsGetphoto)

Я получил токен доступа после (https://msdn.microsoft.com/en-us/library/azure/dn645543.aspx)

но получая эту ошибку: любая помощь?

HTTP/1.1 401 Unauthorized [Content-Length: 0, Server: Microsoft-IIS/8.0, request-id: 6925fcab-9021-4059-af4b-4cbf130faea7, X-CalculatedBETarget: CY1PR0401MB1388.namprd04.prod.outlook.com, X- BackEndHttpStatus: 401, Set-Cookie: exchangecookie = 87cb2447eae9401c80a96c497dff06a9; expires=сб, 22 апреля 2017 г., 07:56:53 по Гринвичу; путь=/; HttpOnly, x-ms-diagnostics: 2000001;reason="Токен доступа получен с использованием слишком слабого метода аутентификации, чтобы разрешить доступ для этого приложения. Представленная сила аутентификации равна 1, требуется 2.";error_category="invalid_token" ,

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

HttpClient httpclient = HttpClients.createDefault();

final String bearerToken = getBearerToken();
HttpGet request = new HttpGet("https://outlook.office.com/api/v2.0/me/photo/$value");
request.setHeader(javax.ws.rs.core.HttpHeaders.AUTHORIZATION, "Bearer " + bearerToken);
request.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);

HttpResponse response = httpclient.execute(request);
return IOUtils.toByteArray(response.getEntity().getContent());

person Pallab Lahiri    schedule 22.04.2016    source источник


Ответы (1)


Судя по сообщению об ошибке. Вместо client_secret в теле запроса вам нужно client_assertion.

Дополнительные сведения можно найти в блоге Создание демона или приложений-служб с помощью API почты, календаря и контактов Office 365 (поток учетных данных клиента OAuth2)

В соответствии с API вы вызываете «https://outlook.office.com/api/v2.0/me/photo/$value". Кажется, вы хотите получить фотографию только для текущего пользователя, вошедшего в систему; если это так, вы можете использовать Поток предоставления кода авторизации, чтобы получить токен, который не потребует клиентских сертификатов.

ОБНОВЛЕНИЕ №1:

Можно ли это сделать программно/API способом

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

https://login.windows.net/common/oauth2/authorize?response_type=code&client_id={0}&resource={1}&redirect_uri={2}&prompt={3}

введите здесь описание изображения

Если вы разрабатываете веб-приложение ASP.NET, вы можете сослаться на образец проекта O365-WebApp-MultiTenant. .

Кстати, при вызове API с токеном приложения необходимо указать имя пользователя.

e.g.

https://outlook.office.com/api/v2.0/users('[email protected]')/messages

ОБНОВЛЕНИЕ №2:

Код 403 при обновлении фотографии с помощью токена приложения является ожидаемым результатом. введите здесь описание изображения

Как видно из рисунка выше, для обновления фотографии пользователя требуется делегированное разрешение «User.Read.Write». У токена приложения нет разрешения на обновление фотографии пользователя.

person Jeffrey Chen    schedule 22.04.2016
comment
Привет Джеффри, спасибо за ваш ответ! Позвольте мне представить вам мой сценарий = это приложение с несколькими арендаторами, которое позволит обновлять профиль пользователя (отображаемое имя, фото и т. д.). После прочтения этого кажется, что мне нужно 1. Получить токен доступа (для конкретного арендатора), используя и Сертификат .509 с парой открытого/закрытого ключа. 2. Создайте какой-нибудь инструмент согласия для установки приложения в каталог арендатора. Я попробую этот маршрут - пока вопрос № 2. Можно ли это сделать программно/способом API, да, конечно, если мы знаем учетные данные администратора для арендатора. - person Pallab Lahiri; 27.04.2016
comment
@Pallab, о вопросе № 2, я обновил его в своем ответе. - person Jeffrey Chen; 28.04.2016
comment
Большое спасибо за ваш ответ, и я пошел по вашему пути, чтобы получить Access_token таким образом, и теперь я столкнулся с другой проблемой: GET graph.microsoft.com/v1.0/users{upn}/photo/$value вернул статус ответа 403 Forbidden - person Pallab Lahiri; 30.04.2016
comment
получил Access_token с согласия администратора и получил это при попытке получить фотографию для другого пользователя в арендаторе: GET graph.microsoft.com/v1.0/users{upn}/photo/$value {null: HTTP/1.1 403 Forbidden}{Cache-Control: private}{Transfer-Encoding: chunked}{Content- Тип: application/json}{Server: Microsoft-IIS/8.5}{request-id: ...}{client-request-id:..}{x-ms-ags-diagnostic: {ServerInfo:{DataCenter:West США,Slice:SliceA,ScaleUnit:001,Host:AGSFE_IN_0,ADSiteName:WST}}}{Duration: 1757.4868}{X-Powered-By: ASP.NET}{Дата: пятница, 29 апреля 2016 г., 22:23:20 по Гринвичу } - и пишем n java - person Pallab Lahiri; 30.04.2016
comment
@Pallab, вы использовали токен пользователя администратора или токен приложения? Согласие администратора принимает мультитенантное приложение, которое можно использовать в этом клиенте, чтобы получить доступ к фотографии другого пользователя, вы должны использовать токен приложения. См. блог Создание демона или приложений-служб с помощью API-интерфейсов почты, календаря и контактов Office 365 (поток учетных данных клиента OAuth2) - person Jeffrey Chen; 02.05.2016
comment
Спасибо . Я использовал токен приложения администратора — после получения кода авторизации (с согласия администратора). отправил запрос на login.microsoftonline.com/‹tenant›/oauth2/token с этими параметрами: params.add(code, code_obtained); params.add(client_id, ‹appId в azureAd›); params.add(client_secret, ‹симметричный ключ в azure ad›); params.add(grant_type, авторизация_код); params.add(redirect_uri, getRedirectURI()); может прочитать атрибут displayName для пользователя в арендаторе, но не фотографию с токеном, думаю, мне нужно использовать client_assertion после . руководство-многопользовательская-идентификация-клиент-утверждение - person Pallab Lahiri; 04.05.2016
comment
code + client_secret вернет токен пользователя, поэтому вы использовали токен пользователя amin. 403 должна быть ожидаемой ошибкой при использовании токена пользователя для доступа к ресурсу другого пользователя. - person Jeffrey Chen; 04.05.2016
comment
Пожалуйста, посмотрите мое нынешнее состояние в ответе - person Pallab Lahiri; 06.05.2016
comment
Вы получили возможность посмотреть на это. Очень ценю вашу помощь. - person Pallab Lahiri; 10.05.2016
comment
@Pallab, посмотрите мое обновление № 2, кстати, поскольку это еще одна проблема, если исходная проблема решена, я предлагаю вам закрыть ее и начать новый специальный вопрос для обсуждения. - person Jeffrey Chen; 10.05.2016
comment
Подойдет... Спасибо и очень ценю вашу помощь! - person Pallab Lahiri; 10.05.2016