1

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

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

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

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

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 такой же, как определено в лазурной области, и это HTTPS. Я уже сделал свой местный env't принимать HTTPS, следуя this. FYI: Я использую java-библиотеку adal4.

+0

Вы зарегистрировали новое приложение V2 для использования на конечной точке V2? Насколько я знаю, вы не можете использовать одно и то же приложение на конечной точке V1 и V2. –

+0

@ShawnTabrizi Я создал новое приложение для этой цели, но где вы скажете, что приложение, с которым вы работаете, - v2 или нет? – WowBow

+1

Вы можете регистрировать приложения V2 только с помощью портала регистрации приложений, как указано [здесь] (https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-flows). Вы увидите их в разделе приложений «Конвергентные приложения» и «Живые приложения SDK», которые являются приложениями, специфичными для MSA, или «Приложениями только для Azure AD», которые являются приложениями V1. –

ответ

2

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

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

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 v2.0 конечной точки, вы можете представить обратную связь от here.

+0

Это отлично работает, но только возвращает токен доступа, но не обновляет токен. Где я могу получить эту информацию? – WowBow

+1

@WowBow вам нужна область offline_access, чтобы получить токен обновления. –

+0

Еще одна проблема: я использовал следующую команду для получения электронной почты для пользователя, подписавшегося на v2 «curl -i https://graph.microsoft.com/v2.0/me/messages -H» Content-Type: application/x-www-form-urlencoded '-H' Авторизация: токен-носитель ... "Теперь это отвечает неверной версией. Все примеры на сайте Microsoft используют https://outlook.office.com/v2.0/me/messages, поэтому я дал эту попытку, и я получил сообщение о том, что мы не можем отображать этот контент. Я немного потерял, что с этим делать. – WowBow