2014-10-14 2 views
2

Я - веб-разработчик, работающий на заднем конце моего сайта. Они хотят интегрировать свою существующую систему CRM с новым сайтом, поэтому сайт может выполнять CRUD-запросы против системы. Тем не менее, я изо всех сил пытаюсь успешно аутентифицироваться в системах Microsoft, и мне бы хотелось, чтобы кто-то помог спланировать лучшую стратегию, чтобы получить эту работу.Интеграция между MS Dynamics CRM 2013 и LAMP

Обзор системы:

Сервер: MS Dynamics CRM 2013 (Интернет облицовочного развертывание), с помощью Active Directory для проверки подлинности

Клиента: ЛАМПЫ (Буду стереосистему и обновите Drupal 7, но это немного, я на самом деле знаю ! как использовать)

во-первых, я попробовал метод аутентификации описан ниже, в «Откройте для конечной точки URL OAuth» раздела:

http://msdn.microsoft.com/en-gb/library/dn531009.aspx#bkmk_oauthurl

Для этого я использовал следующий завиток из командной строки:

curl -H "Authorization: Bearer" http://crm.example.com/XRMServices/2011/Organization.svc -v 

который дает следующий результат:

* Hostname was NOT found in DNS cache 
* Trying xx.xx.xx.xx... 
* Connected to crm.example.com (xx.xx.xx.xx) port 80 (#0) 
> GET /XRMServices/2011/Organization.svc HTTP/1.1 
> User-Agent: curl/7.35.0 
> Host: crm.example.com 
> Accept: */* 
> Authorization: Bearer 
> 
< HTTP/1.1 200 OK 
< Cache-Control: private 
< Content-Length: 3165 
< Content-Type: text/html; charset=UTF-8 
* Server Microsoft-IIS/8.0 is not blacklisted 
< Server: Microsoft-IIS/8.0 
< X-AspNet-Version: 4.0.30319 
< Set-Cookie: ReqClientId=ee9c75fe-db2e-4775-a71e-c2708c46748b; expires=Tue, 14-Oct-2064 09:16:06 GMT; path=/; HttpOnly 
< X-Powered-By: ASP.NET 
< Date: Tue, 14 Oct 2014 09:16:06 GMT 
< 
<HTML>... 

Но нет упоминания о разрешительном :(URI

I также попробовал ту же команду с URL-адресами, заканчивающимися «discovery.svc», «organization.svc/web», «discovery.svc/web». Последние два действительно включают в себя поле «WWW-Authenticate» в ответ следующим образом:

< WWW-Authenticate: Negotiate 
< WWW-Authenticate: NTLM 

Который ведет меня поверить, что я пытался неправильный метод и следует искать в проверке подлинности NTLM МС.

Я установил, что PHP-cURL может использовать NTLM, поэтому мой второй подход включал отправку SOAP-запроса из кода. Аналогично коду в этой StackOverflow теме:

php - access dynamics crm 2011 with web services

Вот мой код:

//sample SOAP envelope from StackOverflow thead 
$SOAPEnv = <<<ENV 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<s:Body> 
    <Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" 
      xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <request i:type="b:AssignRequest" 
      xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts" 
      xmlns:b="http://schemas.microsoft.com/crm/2011/Contracts"> 
    <a:Parameters xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic"> 
    <a:KeyValuePairOfstringanyType> 
     <c:key>Target</c:key> 
     <c:value i:type="a:EntityReference"> 
     <a:Id>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</a:Id> 
     <a:LogicalName>account</a:LogicalName> 
     <a:Name i:nil="true" /> 
     </c:value> 
    </a:KeyValuePairOfstringanyType> 
    <a:KeyValuePairOfstringanyType> 
     <c:key>Assignee</c:key> 
     <c:value i:type="a:EntityReference"> 
     <a:Id>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</a:Id> 
     <a:LogicalName>systemuser</a:LogicalName> 
     <a:Name i:nil="true" /> 
     </c:value> 
    </a:KeyValuePairOfstringanyType> 
    </a:Parameters> 
    <a:RequestId i:nil="true" /> 
    <a:RequestName>Assign</a:RequestName> 
    </request> 
    </Execute> 
</s:Body> 
</s:Envelope> 
ENV; 

$headers = array(
    'Method: POST', 
    'Connection: Keep-Alive', 
    'User-Agent: PHP-SOAP-CURL', 
    'Content-Type: text/xml; charset=utf-8', 
    "SOAPAction: http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute", 
); 


$url = 'http://crm.example.com/XRMServices/2011/Organization.svc/web'; 
$username = 'myusername'; 
$password = '[email protected]'; 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $SOAPEnv); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 

$output = curl_exec($ch); 

И это даст ответ SOAP:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
    <s:Fault> 
     <faultcode xmlns:a="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">a:FailedAuthentication</faultcode> 
     <faultstring xml:lang="en-GB">Access is denied.</faultstring> 
    </s:Fault> 
    </s:Body> 
</s:Envelope> 

отрадно, что это Ответ SOAP, поэтому я чувствую, что я рядом. Это, безусловно, аутентификация с учетными данными, которые я предоставляю, потому что, если я их изменю, я не получу SOAP. Но я считаю, что должен быть еще один уровень аутентификации, чтобы конечная точка SOAP знала, что я законный клиент.

Так что я немного застрял, поскольку документация по использованию SOAP с Dynamics, похоже, написана с точки зрения SDK от Microsoft, и, конечно же, не помогает кому-то из моего опыта, который знает только PHP.

Если бы кто-нибудь мог ответить на мой подход, я был бы очень признателен. Если бы вы могли указать мне в правильном направлении, чтобы продолжить дальше, это было бы еще лучше. И у меня не хватает времени на проект, поэтому выложите это экспертам.Пожалуйста, обратите внимание, что я относительно новый разработчик так заранее извиняюсь, если у вас есть немой вниз ваши ответы немного :)

Большое спасибо, Ashwah

+0

Как вы собираетесь это делать? Вы сделали какой-то прогресс? Я потратил немного времени на подключение Drupal к CRM Online. У меня есть работа, но я никогда не взламывал головоломку Active Directory. Мои расследования находятся в моем блоге. http://crmtroubleshoot.blogspot.com.au/search/label/soap Active Directory - SOAP - CRM, похоже, является повторяющимся вопросом о stackoverflow, и я бы с удовольствием узнал, если вы это выяснили – Campey

+1

Завершено не делая сами аутентификацию. Придется использовать разработчика MS для создания некоторого промежуточного программного обеспечения, чтобы поговорить с Dynamics API. Жаль, что так сложно сделать что-то вроде этой кросс-платформы. Хотя, возможно, для лучшего удобства, это означало, что мы могли бы воспользоваться некоторыми более функциональными функциями CRM. – AshTheSmash

ответ

0

я боролся с чем-то связаны между собой. Я мог бы получить пример кода Python для соединения с облачной версией CRM с именем арендатора, но я пытался интегрироваться с локальной установкой/установкой IFD, у которой был свой собственный STS (маркер безопасности безопасности). Использование этого домена не помогло мне. Я не мог понять, что такое правая redirect_uri.

Как только я понял, что мне нужно подключиться к конечной точке CRI для CRM, чтобы получить разрешение на предъявителя, это сработало.

Если у вас есть INSTAND Dyanmic CRM в foo.crm.dynamics.com вы можете завить это

curl -I https://foo.crm.dynamics.com/api/data/v8.0/WhoAmI

Заменить foo с именем экземпляра CRM и получить обратно что-то вроде этого

 
HTTP/1.1 401 Unauthorized 
Cache-Control: private 
Content-Length: 49 
Content-Type: text/html 
Server: Microsoft-IIS/8.X 
REQ_ID: 995XXXX-XXXX-XXXX-XXX-XXXXXXXXe7 
Set-Cookie: ReqClientId=95XXXX-XXXX-XXXX-XXX-XXXXXXXXe7; expires=Wed, XX-Jan-XX 15:MM:SS GMT; path=/; secure; HttpOnly 
WWW-Authenticate: Bearer authorization_uri=https://login.windows.net/62d6e7de-bbbb-cccc-dddd-4f9605b2ad79/oauth2/authorize, resource_id=https://foo.crm.dynamics.com/ 
X-Powered-By: ASP.NET 
... 

UUID 62d6e7de-bbbb-cccc-dddd-4f9605b2ad79 - это то, что вы ищете. По какой-то причине я объяснил, почему мне нужно было переключить домен с login.windows.net на login.microsoftonline.com.

https://login.microsoftonline.com/62d6e7de-bbbb-cccc-dddd-4f9605b2ad79.

Тогда я смог использовать этот образец кода с именем пользователя и паролем и фактически подключиться.

https://github.com/jlattimer/CrmWebApiPython/blob/master/CrmConnect

Смежные вопросы