2017-12-18 203 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
  • 我有一個方法getAccessToken()是成功返回令牌
  • 方法getUserNamesFromGraph()訪問然而返回401未經授權而不是預期的數據。

我已經經歷了無數次的文檔,嘗試不同的變化和端點,但無濟於事。任何想法讚賞。

+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其中解釋瞭如何授予該權限。您必須調用該交互式同意對話框來授予您的應用程序權限。否則,您仍然會收到權限不足錯誤。

Then here is the complete list of different Microsoft Graph permissions。在你的情況下 - 一個沒有用戶交互的守護進程應用程序,你必須查看應用程序權限而不是**委託權限*。

一旦您授予適當的權限,您將能夠查詢用戶。你做不是必須改變你的令牌請求的範圍。保持原樣:https://graph.microsoft.com/.default

一旦完成所有這些更改,可以使用https://jwt.ms來檢查您的訪問令牌。在那裏,您可以提取所有索賠,並檢查您的受衆和範圍索賠,以進一步瞭解爲什麼從Microsoft Graph獲得401。

相關問題