2017-01-23 16 views
0

私は、Azure AD oAuth 2認証でDynamics CRMオンラインREST APIにアクセスしようとしています。私は組織のユーザーとして委任されたアクセス許可「のアクセスCRMオンラインを持っているダイナミクスCRMへのアクセス権を設定したAzureのWebアプリケーションおよび/またはウェブAPI CRM APIにアクセストークンを渡すと、不正な(401)エラーが発生する

  • を登録した

    • :そうするためには、私はこれらの手順に従っ"
    • 有効期限が1年のKeyを作成し、クライアントIDを生成したままにします。

    マイコード:

    package com.JasonLattimer.crm.auth; 
    import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStreamReader; 
    import java.net.HttpURLConnection; 
    import java.net.MalformedURLException; 
    import java.net.URL; 
    import java.util.concurrent.ExecutorService; 
    import java.util.concurrent.Executors; 
    import java.util.concurrent.Future; 
    
    import javax.naming.ServiceUnavailableException; 
    
    import com.microsoft.aad.adal4j.AuthenticationContext; 
    import com.microsoft.aad.adal4j.AuthenticationResult; 
    import com.microsoft.aad.adal4j.ClientCredential; 
    
    import net.minidev.json.JSONObject; 
    import net.minidev.json.JSONValue; 
    
    public class App { 
    
    
        // CRM URL 
        private final static String RESOURCE = "xxxxxx.crm8.dynamics.com"; 
        private final static String CLIENT_ID = "xxxxxxx-xxxxx-xxxxxxx-xxxxxxxxx"; 
        private final static String CLIENT_SECRET_KEY = "xxxxxxxxxxxxxxxxxxxxxx"; 
        private final static String TENANTID = "xxxxxxxxxxx-xxxx-xxxxx-xxxxxxx"; 
        private final static String AUTHORITY = "login.microsoftonline.com" + TENANTID + "/oauth2/authorize"; 
    
        public static void main(String args[]) throws Exception { 
         AuthenticationResult result = getAccessTokenFromUserCredentials(); 
         System.out.println("Access Token - " + result.getAccessToken()); 
         System.out.println("Token expires on - " + result.getExpiresOn()); 
    
         //String userId = WhoAmI(result.getAccessToken()); 
         //System.out.println("UserId - " + userId); 
    
         String fullname = FindFullname(result.getAccessToken(), "2b8fc8ca-86cd-e611-8109-c4346bdc0e01"); 
         System.out.println("Fullname: " + fullname); 
        } 
    
        private static AuthenticationResult getAccessTokenFromUserCredentials() throws Exception { 
    
         AuthenticationContext authContext = null; 
         AuthenticationResult authResult = null; 
         ExecutorService service = null; 
    
         try { 
          service = Executors.newFixedThreadPool(1); 
          authContext = new AuthenticationContext(AUTHORITY, false, service); 
    
          ClientCredential clientCred = new ClientCredential(CLIENT_ID, CLIENT_SECRET_KEY); 
          Future<AuthenticationResult> future = authContext.acquireToken(RESOURCE, clientCred, null); 
          authResult = future.get(); 
         } catch (Exception ex) { 
          System.out.println(ex); 
         } finally { 
          service.shutdown(); 
         } 
    
         if (authResult == null) { 
          throw new ServiceUnavailableException("authentication result was null"); 
         } 
         return authResult; 
        } 
    
        private static String FindFullname(String token, String userId) throws MalformedURLException, IOException { 
         System.out.println("AAAAAAAAAAAAAAAAAA"); 
         HttpURLConnection connection = null; 
         //The URL will change in 2016 to include the API version - /api/data/v8.0/systemusers 
         URL url = new URL(RESOURCE + "/api/data/systemusers(" + userId + ")?$select=fullname"); 
         connection = (HttpURLConnection) url.openConnection(); 
         connection.setRequestMethod("GET"); 
         connection.setRequestProperty("OData-MaxVersion", "4.0"); 
         connection.setRequestProperty("OData-Version", "4.0"); 
         connection.setRequestProperty("Accept", "application/json"); 
         connection.addRequestProperty("Authorization", "Bearer " + token); 
    
         int responseCode = connection.getResponseCode(); 
    
         BufferedReader in = new BufferedReader(
           new InputStreamReader(connection.getInputStream())); 
         String inputLine; 
         StringBuffer response = new StringBuffer(); 
    
         while ((inputLine = in.readLine()) != null) { 
          response.append(inputLine); 
         } 
         in.close(); 
    
         Object jResponse; 
         jResponse = JSONValue.parse(response.toString()); 
         JSONObject jObject = (JSONObject) jResponse; 
         String fullname = jObject.get("fullname").toString(); 
         System.out.println("FULL NAME" + fullname); 
         return fullname; 
        } 
    
        private static String WhoAmI(String token) throws MalformedURLException, IOException { 
         HttpURLConnection connection = null; 
         //The URL will change in 2016 to include the API version - /api/data/v8.0/WhoAmI 
         URL url = new URL(RESOURCE + "/api/data/WhoAmI"); 
         connection = (HttpURLConnection) url.openConnection(); 
         connection.setRequestMethod("GET"); 
         connection.setRequestProperty("OData-MaxVersion", "4.0"); 
         connection.setRequestProperty("OData-Version", "4.0"); 
         connection.setRequestProperty("Accept", "application/json"); 
         connection.addRequestProperty("Authorization", "Bearer " + token); 
    
         int responseCode = connection.getResponseCode(); 
    
         BufferedReader in = new BufferedReader(
           new InputStreamReader(connection.getInputStream())); 
         String inputLine; 
         StringBuffer response = new StringBuffer(); 
    
         while ((inputLine = in.readLine()) != null) { 
          response.append(inputLine); 
         } 
         in.close(); 
    
         Object jResponse; 
         jResponse = JSONValue.parse(response.toString()); 
         JSONObject jObject = (JSONObject) jResponse; 
         String userId = jObject.get("UserId").toString(); 
         return userId; 
        } 
    } 
    

    私はトークン成功したアクセス権を取得するが、私はCRMへのHttpRequestを実行しようとするとき、私はいつも401取得 - 不正なステータスコードを。私は何が欠けていますか?

  • 答えて

    0

    あなたは2つのオプションがあります:あなたがCRMで「通常」のユーザ(あなたは自分のパスワードが必要になりますが、ポップアップの流れを回避することができます)として認証

    1. 古い方法を。 C#example here
    2. 新しい方法は、サーバーからサーバーへの認証で、Application Userを作成する必要があります。この例もC#ですが、ADALコードはJavaで非常に似ているはずです。
    関連する問題