2017-01-23 6 views
0

Я пытаюсь получить доступ к API REST в реальном времени Dynamics CRM с помощью аутентификации Azure AD oAuth 2. Для этого я последовал за следующие действия:Передача токена доступа в CRM API выдает несанкционированную ошибку (401)

  • Я зарегистрировал веб-приложение и/или веб-АФИ в Azure
  • настроенному разрешения на Dynamics CRM, чтобы иметь делегированы полномочия «Доступ к CRM Online, как пользователь организации "
  • И создал ключ с истечением 1 года и сгенерировал идентификатор клиента.

Мой код:

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; 
    } 
} 

я получить маркер доступа успешно, но когда я пытаюсь сделать HTTPRequest к CRM Я всегда получаю 401 а - Несанкционированный код статуса. Что мне не хватает?

ответ

0

У вас есть 2 варианта:

  1. старый путь, где вы аутентификации в качестве «нормального» пользователя в CRM (вам нужно свой пароль, но может избежать всплывающий поток). C# пример here.
  2. Новый способ - «Аутентификация сервера на сервер», который требует создания Application User. ПРИМЕЧАНИЕ. Этот пример также является C#, но код ADAL должен быть очень похож на Java.
Смежные вопросы