Код авторизации API Office 365 v2 имеет неверный формат или недействителен

У меня есть следующий код авторизации, скопированный из браузера для пользователя, который разрешил нашему приложению использовать свою электронную почту Office 365.

code=OAQABAAIAAADRNYRQ3dhRSrm-4K-adpCJ3J3UJ8GyC2qJDvNhlrUAObjph6sQ3A9waeQ5Tr-DA6WzxCdFbvadCRJw2S4a_lwA7MyelZWAPQZOlaB_X_1165CbmTXJMGioU6Cr0DhVTUzIlUv_-Svjp8DBrLVCxcDp5rJMM5mDNR0iGysuDIozWnOaPqCOl35NxPzyktrYK6D1MBptmXOPbhS-stTZXbHJr9gGE3FHzMU0XANXmTm30q4SPaoWPch-S1uFFL4xwS2oUv-lELBdcfIGh5UJBSraabGihVWUnbwBhh8eURSMRwryi7kubUcq0D27S-vIVZhtKopemQ1njAcExO58S7EgAyqbIzMxvmBXBe0X1ieVrcyHYRpt4ZAq1Z4v5HLTrYhx5fGp6AkqhV09yri3bqXaZvw5R1hKuhAbRDt_isZn_L8ZEhfwnqICGUwpDU27c6Qd1txuiOVY90a4BiAUh1M1u5gjDx8nIE88R7S915w7mUjJtCzZuTKQavve8q8UOtm9udUvBOX1f-bYslpgiIRbdSYBYlP9UrbreLS1W6OFk2NX-uqp9mabyImvvj1RUm166qV6uc9hsuhzrfErDURC17JotuQBSWYauAvb38p5B-cDbsCZafpyORlbrWsYyQcdWwUPL0aOZEQXFW-v3gDw7Xri_9hvsiHrj10NTaaozqm1QpZmMf-SHJ0yF9wBWKYgAA

Приложение работает без проблем, если мы используем Microsoft Graph REST API v1, но следующая проблема возникает при использовании версии 2. Оно зарегистрировано с разрешениями делегата, которые предоставляют нам разрешения на чтение, запись/отправку, которые отлично работают с V1 приложения.

Для V2: authority =https://login.microsoftonline.com/common/oauth2/v2.0/token и для получения кода авторизации я использую следующий URL-адрес

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=30..7&response_type=code&scope=mail.read&redirect_uri=https://myurl:8443/controller/saveToken

Блок кода, вызывающий проблему:

 @Override
    public AuthenticationResult getToken(String authCode) {

        ExecutorService service = Executors.newFixedThreadPool(1);
        OfficeCredentials credentials = getCredentials();

        try {
            AuthenticationContext context = new AuthenticationContext(credentials.getAuthority(), true, service);
            final Future<AuthenticationResult> resultFuture = context.acquireTokenByAuthorizationCode(
                    authCode, new URI(credentials.getRedirectUri()), new ClientCredential(credentials.getClientId(),
                            credentials.getClientSecret()), credentials.getResourceUrl(), null);

            return resultFuture.get();//throws exception

        } catch (URISyntaxException e) {
            logger.error(e.getMessage());
        } catch (MalformedURLException e) {
            logger.error(e.getMessage());
        } catch (Exception e) {
            logger.error(e.getMessage());

        }

        return null;

    }

Исключение при вызове resultFuture.get()

java.util.concurrent.ExecutionException: com.microsoft.aad.adal4j.AuthenticationException: {"error_description":"AADSTS70000: Transmission data parser failure: Authorization Code is malformed or invalid.\r\nTrace ID: c37b4aba-c5fb-44f3-815c-dd798072095d\r\nCorrelation ID: e190ccd2-f98a-440c-8e79-69cfcead3c04\r\nTimestamp: 2017-02-06 17:53:30Z","error":"invalid_grant"}

Я не знаю, что я делаю неправильно, поскольку я пытаюсь перейти на v2. redirect_uri такой же, как определено в azure, и это HTTPS. Я уже заставил свою локальную среду не принимать HTTPS, выполнив это. К вашему сведению: я использую java-библиотеку adal4.


person WowBow    schedule 06.02.2017    source источник
comment
Вы зарегистрировали новое приложение V2 для использования на конечной точке V2? Насколько мне известно, вы не можете использовать одно и то же приложение на конечных точках V1 и V2.   -  person Shawn Tabrizi    schedule 07.02.2017
comment
@ShawnTabrizi Я создал новое приложение для этой цели, но где вы говорите, что приложение, с которым вы работаете, является версией 2 или нет?   -  person WowBow    schedule 07.02.2017
comment
Вы можете регистрировать приложения V2 только с помощью портала регистрации приложений, как указано здесь. Вы увидите их в разделе приложений под названием Конвергентные приложения и приложения Live SDK, которые являются приложениями, специфичными для MSA, или приложениями только для Azure AD, которые являются приложениями V1.   -  person Shawn Tabrizi    schedule 07.02.2017
comment
Да, это то, что я сделал.   -  person WowBow    schedule 07.02.2017
comment
Я повторил ту же процедуру с новым приложением. Совсем не повезло. Это просто расстраивает.   -  person WowBow    schedule 07.02.2017


Ответы (1)


В настоящее время библиотека adal4j не поддерживает конечную точку Azure AD версии 2.0 (см. здесь). Событие, когда мы устанавливаем полномочия для конечной точки версии 2.0, она по-прежнему использует старую.

В качестве обходного пути вы можете составить HTTP-запрос напрямую. Вот пример запроса для справки (см. здесь):

POST: https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token

client_id={clientId}&client_secret={clientSecret}&scope={scope}&code={authorizationCode}&grant_type=authorization_code&redirect_uri={redirectUri}

И если вы хотите, чтобы библиотека adal4j поддерживала конечную точку Azure AD версии 2.0, вы можете отправить отзыв с здесь.

person Fei Xue - MSFT    schedule 07.02.2017
comment
Это прекрасно работает, но возвращает только токен доступа, но не токен обновления. Где я могу получить эту информацию? - person WowBow; 07.02.2017
comment
@WowBow вам нужна область offline_access, чтобы вернуть токен обновления. - person Daniel Dobalian; 08.02.2017
comment
Еще одна проблема: я использовал следующую команду для получения электронных писем пользователя, подписавшегося на v2 curl -i graph.microsoft.com/v2.0/me/messages -H 'Тип содержимого: application/x-www-form-urlencoded' -H 'Авторизация: токен носителя... Теперь это отвечает обратно с неверной версией. Во всех примерах на сайте Microsoft используется outlook.office.com/v2.0/me/messages. поэтому я попробовал это и получил сообщение о том, что мы не можем отобразить это содержимое. Я немного потерялся в том, что делать с этим. - person WowBow; 08.02.2017
comment
URL-адрес содержит https, даже если SO удалил его из комментария. - person WowBow; 08.02.2017
comment
Дополнительные сведения о пользователе: у пользователя есть учетная запись Azure AD на office.com, поэтому это адрес электронной почты компании. Я также использовал тот же адрес электронной почты для регистрации приложения. Таким образом, этот пользователь не является внешним пользователем, а тем же пользователем, который существует в том же AD. - person WowBow; 08.02.2017
comment
Вторая проблема: для другого электронного письма из того же AD я получил следующий код авторизации M318eb27d-ef61-dea3-47a2-58e00dd5ab8b, который почему-то короче того, что я видел раньше... и я не мог получить токен доступа для этого человека (возвращает BAD запрос). Я мог бы задать вопрос в новой теме, но я просто расстраиваюсь из-за того, что задаю вопросы по каждой отдельной проблеме, поскольку нет ссылки, в которую я мог бы заглянуть. - person WowBow; 08.02.2017
comment
@Fei Xue, есть мысли по этому поводу? - person WowBow; 08.02.2017
comment
Существует только одна версия выпуска (v1.0) и бета-версия для Microsoft Graph. Есть ли подробное сообщение об ошибке, связанное с невозможностью получить токен доступа? Кроме того, для новой проблемы я по-прежнему предлагаю повторно открыть новую тему, чтобы другие сообщества, у которых есть такая же проблема, могли распознать проблему и быстро поделиться своим опытом. - person Fei Xue - MSFT; 09.02.2017
comment
@WowBow мы предлагаем десятки примеров кода для помощи с Azure AD, которые могут послужить хорошим справочным материалом. Попробуйте github.com/azure-samples и найдите active-directory-, и вы получите кучу. Кроме того, чтобы просмотреть весь набор документов, перейдите по адресу aka.ms/aaddev. - person Daniel Dobalian; 09.02.2017