我正在尝试使用PHP和CURL连接到Microsoft Dynamics API,以便我可以从CRM读取客户端数据 . API指南可在此处找到:https://msdn.microsoft.com/en-gb/library/mt593051.aspx
我已经进入Azure门户并设置了一个新的应用程序,它为我提供了使用的凭据(客户端ID,密码等)和url endpoints . 使用这些凭据,我能够成功连接到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 ?!
?>
据我所知,在后端没有其他任何配置,任何帮助将非常感激 .
2 回答
根据获取令牌的参数,您混合了 client credentials flow 和 resource owner password flow 以及缺少
resource
参数 .客户端凭据流需要参数
grant_type
,client_id
,client_secret
,resource
,grant_type
的值为client_credentials
.资源所有者密码凭据流需要
grant_type
,client_id
,client_secret
,username
,password
,resource
,grant_type
的值为password
.如果您使用的是客户端凭据流,则可以参考this blog获取令牌 . 如果你使用 resource owner password ,你可以参考this thread .
有关Oauth 2流量差异的详细信息,请参阅RFC 6749 .
我编写了一个轻量级PHP类,用于处理Dynamics 365在线Web API . 你可以找到here .
BTW在你的代码中你应该在grant_type中尝试“password”而不是“client_credentials”