Невозможно подключиться к Microsoft Dynamics CRM с помощью PHP и Curl

Я пытаюсь использовать PHP и CURL для подключения к Microsoft Dynamics API, чтобы я мог читать данные клиента из CRM. Руководство по API можно найти здесь:
https://msdn.microsoft.com/en-gb/library/mt593051.aspx

Я был на портале Azure и настроил новое приложение, и оно дает мне учетные данные для использования (идентификатор клиента, секрет и т. Д.) И конечные точки URL. Используя эти учетные данные, я могу успешно подключиться к CRM и получить токен доступа на предъявителя, но я не могу получить дальше.

Когда я пытаюсь использовать токен для возврата данных, я получаю следующее сообщение об ошибке:

Ошибка HTTP 401 — неавторизовано: доступ запрещен

Я предполагаю, что я должен правильно передавать токен?

Мой код ниже.

<?php
// Step 1 - Use the credentials supplied by CRM to get an access token (this bit works okay)
$credentials = array(
'grant_type'=>'client_credentials',
'username'=>'xxxxxxxx',
'password'=>'xxxxxxxx',
'client_id'=>'xxxxxxxxxxxx',
'client_secret'=>'xxxxxxxxxx',
);
$urlSafeCredentials = http_build_query($credentials);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'https://login.microsoftonline.com/xxxxxxxxxxxxxx/oauth2/token');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $urlSafeCredentials);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
$response = curl_exec($ch);
$result = json_decode($response);
curl_close($ch);// A BEARER access token is successfully returned
$token = $result->access_token;// Step 2 - Use the access token to request data from the CRM (this bit fails with HTTP Error 401 - Unauthorized: Access is denied)

$ch = curl_init('https://clientspecificurl.crm4.dynamics.com/api/data/v8.1/accounts');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Content-Type: application/x-www-form-urlencoded','Authorization: Bearer '.$token));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
print_r($response); // 401 Unauthorized ?!
?>

Насколько я могу судить, на заднем плане ничего настраивать нельзя, любая помощь будет высоко ценится.

1

Решение

Основываясь на параметрах для получения токена, вы смешивали поток учетных данных клиента а также поток пароля владельца ресурса и отсутствие resource параметр.

Поток учетных данных клиента требует параметров grant_type,client_id,client_secret,resource и значение grant_type является client_credentials,

Поток учетных данных пароля владельца ресурса требует grant_type,client_id,client_secret,username,password,resource и значение grant_type является password,

Если вы использовали поток учетных данных клиента, вы можете обратиться этот блог для получения токена. И если бы вы использовали пароль владельца ресурса, вы можете сослаться эта тема.

Подробности о разнице потоков в Oauth 2 смотрите RFC 6749.

0

Другие решения

Я написал легкий PHP-класс для работы с динамическим веб-API Dynamics 365. Вы можете найти это Вот.

Кстати, в вашем коде вы должны попробовать «пароль» внутри grant_type вместо «client_credentials»

0

По вопросам рекламы [email protected]