2017-12-18 22 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; 
    } 
  • アプリケーションはgetUserNamesFromGraph() Iが正常
  • アクセストークンを返すメソッドgetAccessToken()方法を有するregistered
  • あるが代わりに予想されるデータの不正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ここでその許可を与える方法が説明されています。アプリケーションに権限を与えるには、その対話同意ダイアログを呼び出す必要があります。そうしないと、不十分な権限エラーが表示されます。

次にhere is the complete list of different Microsoft Graph permissions。あなたのケースでは - デーモンアプリケーションとユーザとのやりとりがなくても、アプリケーションのアクセス許可ではなく、**委任されたアクセス権*を参照する必要があります。

適切な権限を付与すると、ユーザーに問い合わせることができます。 ではなく、はトークン要求のスコープを変更する必要があります。 https://graph.microsoft.com/.default

これらの変更をすべて行ったら、https://jwt.msを使用してアクセストークンを確認できます。そこでは、すべてのクレームを抽出し、聴衆と範囲の主張を確認して、なぜMicrosoft Graphから401を取得するのかを理解することができます。

関連する問題