状态码:尝试创建邮件事件订阅时被禁止

时间:2017-09-29 17:57:38

标签: microsoft-graph

我尝试使用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.ReadUser.Read.All授予了我的应用程序。

我跟随this documentation

在致电/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: Microsoft Application Portal Permissions

所以看起来我的应用程序权限没有反映在我的令牌中。

非常感谢任何帮助!!

1 个答案:

答案 0 :(得分:1)

最后想出来了......我没有为新的Mail.Read权限提供“管理员同意”。

我在标题为“管理员同意”的部分找到了答案here。您只需按照指示输入网址,然后在登录后点击“接受”。请注意,redirect_uri参数不必工作 - 如果没有,那么当您单击“接受”时,您将收到错误消息,但管理员同意仍将被授予。