2017-12-18 20 views
0

Microsoft Graph API에서 데이터를 가져올 수 없습니다.Microsoft Graph 401 액세스 토큰 사용 권한이 없습니다.

private String getUserNamesFromGraph() throws Exception { 
     String bearerToken = "Bearer "+getAccessToken(); 
     String url = "https://graph.microsoft.com/v1.0/users"; 
     String returnData = null; 

     try { 
     URL apiURL = new URL(url); 
     URLConnection con = apiURL.openConnection(); 
     con.setRequestProperty("Authorization", bearerToken); 
     con.setRequestProperty("Content-Type", "application/json"); 

     BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
      String inputLine; 
      StringBuffer response = new StringBuffer(); 

      while((inputLine = in.readLine()) != null) { 
       response.append(inputLine); 
      } 
      in.close(); 

     returnData = response.toString(); 
     System.out.println(returnData); 

     } catch(Exception e) { 
     System.out.println(e); 
     } 

     return returnData; 
    } 

private String getAccessToken() throws Exception { 
    String url = "https://login.microsoftonline.com/common/oauth2/v2.0/token"; 
     URL obj = new URL(url); 
     HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); 

     // header 
     con.setRequestMethod("POST"); 
     con.setRequestProperty("User-Agent", "eTarget API"); 
     con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 

     String urlParameters = "client_id=*** 
APPLICATION ID FROM APPLICATION REGISTRATION PORTAL ***&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=*** 
APPLICATION SECRET FROM APPLICATION REGISTRATION PORTAL ***&grant_type=client_credentials"; 
     // Send post request 
     con.setDoOutput(true); 
     DataOutputStream wr = new DataOutputStream(con.getOutputStream()); 
     wr.writeBytes(urlParameters); 
     wr.flush(); 
     wr.close(); 

     int responseCode = con.getResponseCode(); 
     System.out.println("\nSending 'POST' request to URL : " + url); 
     System.out.println("Post parameters : " + urlParameters); 
     System.out.println("Response Code : " + responseCode); 

     BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
     String inputLine; 
     StringBuffer response = new StringBuffer(); 

     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 
     in.close(); 

     //print result 
    String returnData = response.toString(); 
     System.out.println(returnData); 

    Map jsonTokenData = new Gson().fromJson(returnData, Map.class); 
    String accessToken = (String)jsonTokenData.get("access_token"); 
    //System.out.println(accessToken); 

    return accessToken; 
    } 
  • 응용 프로그램은 registered
  • 나는 성공적 그러나 대신 예상되는 데이터의 무단 401을 반환
  • 방법 getUserNamesFromGraph() 액세스 토큰을 반환하는 방법 getAccessToken()을 가지고있다.

다른 변형과 종단점을 사용해 보았지만 아무런 소용이 없었습니다. 어떤 아이디어라도 감사합니다.

+0

은 해당 '스코프'로 생성 된 액세스 토큰이므로 사용자 목록에 액세스 할 수 있습니까? 어쩌면 당신은 당신의 접근 토큰 URL (분명히 클라이언트/비밀 비트 없음)을 어떻게 만드는지를 공유 할 수 있습니다 – sfat

+0

또한 이것을 확인하십시오 https://developer.microsoft.com/en-us/graph/docs/concepts/permissions_reference#delegated-permissions -application-permissions-and-effective-permissions – sfat

+0

감사합니다. @sfat, 액세스 토큰을 가져 오는 방법을 추가했습니다. 권한에 대해 살펴 보겠습니다. –

답변

1

응용 프로그램에 사용자를 읽기 위해서는 명시 적으로 부여 된 User.Read.Allapplication permission이 있어야합니다. 이 권한을 얻으려면 관리자 동의가 필요합니다. Here is one link 여기서 해당 권한을 부여하는 방법에 대해 설명합니다. 대화 형 승인 대화 상자를 호출하여 응용 프로그램에 권한을 부여해야합니다. 그렇지 않으면 불충분 한 권한 오류가 발생합니다. . 귀하의 경우 - 사용자 상호 작용이없는 데몬 응용 프로그램 인 경우 응용 프로그램 사용 권한을보고 위임 된 사용 권한 *이 아니어야합니다.

일단 적절한 사용 권한을 부여하면 사용자를 쿼리 할 수 ​​있습니다. 이 아닌은 토큰 요청의 범위를 변경해야합니다. 다음과 같이 그대로 두십시오. https://graph.microsoft.com/.default

이러한 사항을 모두 변경하면 https://jwt.ms을 사용하여 액세스 토큰을 확인할 수 있습니다. 여기서 모든 주장을 추출하고 잠재 고객 및 범위 주장을 확인하여 Microsoft Graph에서 401을 얻는 이유를 더 자세히 이해할 수 있습니다.