Я пытаюсь использовать 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 ?!
?>
Насколько я могу судить, на заднем плане ничего настраивать нельзя, любая помощь будет высоко ценится.
Основываясь на параметрах для получения токена, вы смешивали поток учетных данных клиента а также поток пароля владельца ресурса и отсутствие 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.
Я написал легкий PHP-класс для работы с динамическим веб-API Dynamics 365. Вы можете найти это Вот.
Кстати, в вашем коде вы должны попробовать «пароль» внутри grant_type вместо «client_credentials»