我尝试使用Microsoft Graph的/subscriptions
端点,但我得到以下回复:
stdClass Object
(
[error] => stdClass Object
(
[code] => ExtensionError
[message] => Operation: Create; Exception: [Status Code: Forbidden; Reason: Forbidden]
[innerError] => stdClass Object
(
[request-id] => 15acd5eb-46db-408e-8c6b-3bb779d63940
[date] => 2017-09-29T17:44:45
)
)
)
在Microsoft应用程序注册门户中,我将应用程序权限Mail.Read
和User.Read.All
授予了我的应用程序。
在致电/subscriptions
之前,我已成功检索访问令牌并使用它从/users
端点检索用户信息。
我使用PHP curl来发出这些请求:
$url = "https://graph.microsoft.com/v1.0/subscriptions/";
$headers = array();
$headers[] = 'Authorization: Bearer '.$token;
$headers[] = 'Content-Type: application/json';
$postData = array (
"changeType" => "created,updated",
"notificationUrl" => "https://example.com/subscriptionListener.php",
"resource" => "users/GUID-of-a-user/mailFolders('Inbox')/messages",
"expirationDateTime" => "2017-10-01T18:23:45.9356913Z",
"clientState" => "12345"
);
$postJSON = json_encode($postData);
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($postData));
curl_setopt($ch,CURLOPT_POSTFIELDS,$postJSON);
curl_setopt($ch,CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
echo "<pre>", print_r(json_decode($result), 1), "</pre>";
我的确认终端(subscriptionListener.php
)正在使用验证令牌进行调用,但如果我向我订阅的帐户发送了一封电子邮件,我就没有收到通知。
更新:我将我的令牌粘贴到token debugger,发现我的令牌显示了以下角色:
"roles": [
"User.Read.All"
],
订阅端点需要Mail.Read
,根据我的应用程序的Microsoft Application Portal:
所以看起来我的应用程序权限没有反映在我的令牌中。
非常感谢任何帮助!!
答案 0 :(得分:1)
最后想出来了......我没有为新的Mail.Read
权限提供“管理员同意”。
我在标题为“管理员同意”的部分找到了答案here。您只需按照指示输入网址,然后在登录后点击“接受”。请注意,redirect_uri
参数不必工作 - 如果没有,那么当您单击“接受”时,您将收到错误消息,但管理员同意仍将被授予。