2016-09-07 3 views
0

Я разрабатываю приложение на стороне сервера для получения электронных писем из нашего Office 365, фильтрует электронные письма и храним их в нашей БД без входа в систему. Here - это ссылка на мой предыдущий вопрос, если вы хотите увидеть некоторые детали.403: запрещено при чтении писем с приложения на стороне сервера с использованием Microsoft Graph

Я следующие методы

@Test 
    public void testGetAccessTokenDeamon() throws Exception { 

     String tenant="f0245-fd24-r3s-be8a-7745gra60be3"; 
     String authority = "https://login.windows.net/"+tenant+"/oauth2/authorize"; 
     ExecutorService service=null; 
     service= Executors.newFixedThreadPool(1); 

     try{ 

      AuthenticationContext authenticationContext= new AuthenticationContext(authority,false,service); 
      String certFile="/mycert.pfx"; 
      InputStream pkcs12Cert= new SharedFileInputStream(certFile); 

      AsymmetricKeyCredential credential=AsymmetricKeyCredential.create("g564f4-e53c-45b7-938a-gt6445gy667",pkcs12Cert,"passwd"); 


      Future<AuthenticationResult> future=authenticationContext.acquireToken("https://graph.microsoft.com",credential,null); 

      System.out.println("Token Received"+future.get().getAccessToken()); 
      String token = future.get().getAccessToken(); 

      HttpGet httpGet = new HttpGet("https://graph.microsoft.com/v1.0/users"); 

      httpGet.setHeader("Authorization", "Bearer "+token); 


      GraphServices graphServices = new GraphServices(); 
      ResponseEntity<String> responseEntity; 


      responseEntity = graphServices.getEmails(token); 




      //HttpClient httpClient= HttpClients.createDefault(); 

      //HttpResponse response=httpClient.execute(httpGet); 
      //HttpEntity entity=response.getEntity(); 

     } 
     catch (MalformedURLException e){ 
      e.printStackTrace(); 

     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 


    } 

public ResponseEntity<String> getEmails(String accessToken) throws Exception 
    { 
     logger.info("In getEmails"); 

     RestTemplate restTemplate = new RestTemplate(); 
     HttpHeaders headers = new HttpHeaders(); 
     HttpEntity<String> request; 

     headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); 
     headers.add(AuthorizationConstants.AUTHORIZATION, AuthorizationConstants.BEARER + " " + accessToken); 
     request = new HttpEntity<String>(headers); 

     ResponseEntity<String> response = restTemplate.exchange("https://graph.microsoft.com/v1.0/users/[email protected]/messages", HttpMethod.GET, request, String.class); 
     return response; 
    } 

Если я пытаюсь использовать https://graph.microsoft.com/v1.0/users/ в restTemplate я получить список пользователей, но и для конкретного пользователя выше код возвращает 403.

Не могли бы вы посоветовать мне, какой конец использовать, чтобы мое приложение могло получать доступ к отдельным сообщениям без входа в систему? Я уже дал приложению все разрешения (полномочия делегата и приложения), которые необходимы.

ОБНОВЛЕНИЕ: Это то, что у меня есть, когда я запускаю токен на http://jwt.calebb.net/ и не смог найти раздел scp/scope.

{ 
typ: "JWT", 
alg: "RS256", 
x5t: "xxxxx_mfg5JKHrwLBbd_4s", 
kid: "xxxxx_mfg5JKHrwLBbd_4s" 
}. 
{ 
aud: "https://graph.microsoft.com", 
iss: "https://sts.windows.net/f456fyu44-df44-d3t3-f342-66423er4323/", 
iat: 1473280446, 
nbf: 1473280446, 
exp: 1473284346, 
appid: "4fw423gh-er423-45b7-zd32-3fwer2343szd", 
appidacr: "2", 
e_exp: 10800, 
idp: "https://sts.windows.net/g0412253-aeb2-4a8a-ju76-8736272a3u7e3/", 
oid: "33dd3455-0195-4708-rt44-34552321ds32d2", 
sub: "33dd3455-0195-4708-813d-34552321ds32d2", 
tid: "33dd3455-ae23-r456-be8a-7737cf4321d2e3", 
ver: "1.0" 
}. 
[signature] 

вот список разрешений, которые я дал (все разрешения пока) для приложения.

Microsoft Graph - Права доступ Применения: 18 -Delegated Право доступ: 40 Windows Azure Active Directory -Применение Право доступ: 4 - делегированы полномочия: Права доступ 8 Office 365 Exchange Online -Применения: 9- делегированы разрешения: 30

ответ

1

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

Возможно, это не так :). Обычно запрещенное значение 403 означает, что ваш токен не имеет требуемой области (в заявке scp) для API, который вы вызываете. Легкий способ узнать: захватить токен в отладчике (это большая длинная строка base64), затем перейти к http://jwt.calebb.net/ и вставить его. Вы увидите, что он декодирован в веб-токен JSON. Посмотрите на roles претензии:

roles: [ 
    "Calendars.Read", 
    "Mail.Read", 
    "Contacts.Read"  
], 

Если у вас нет Mail.Read или Mail.ReadWrite, у вас нет необходимых разрешений, настроенных.

+0

Нет никакого раздела scp. :( – WowBow

+0

Я обновил свой вопрос, чтобы отразить текущий токен. – WowBow

+0

Где я могу настроить область действия, если она отличается от описанной выше? – WowBow

Смежные вопросы