Microsoft Graph Webhook缺少ClientState

时间:2017-08-07 19:46:57

标签: microsoft-graph

我无法启动Microsoft Graph webhook订阅(特别是邮箱)。在启动订阅时,似乎Microsoft接受我发送的所有参数以配置订阅但未通过总订阅,因为它从我配置的端点收到非2xx响应。

我的端点向Microsoft发送401的原因是因为包含订阅验证令牌的POST缺少clientState。

我正在使用clientState键值对来验证Microsoft和我的端点之间的所有通信。如果我的端点没有看到正确的clientState,它将返回401

关于我可能缺少什么的想法,或者我是否应该以不同的方式解决这个问题?在我看来,允许我的端点接受未经身份验证的GET / POST不是一种选择。

示例请求正文使用POST方法,包括标题中的API密钥:

{
    "changeType": "created",
    "clientState": "testClientState",
    "resource": "users/<UserName>/messages",
    "expirationDateTime": "2017-08-10T10:24:57.0000000Z",
    "notificationUrl": "<EndpointURL>"
}

从Microsoft返回错误:

"error": {
    "code": "InvalidRequest",
    "message": "Subscription validation request failed. Must respond with 200 OK to this request.",
    "innerError": {
        "request-id": "adf7fc7b-6b14-4422-8526-c1391be8dd27",
        "date": "2017-08-07T16:24:59"
    }
}

我理解一切按预期工作,直到我的端点被发送验证令牌,因为我收到验证令牌但我的端点拒绝它,因为它缺少客户端状态。

Endpoint Log Snippet:

queryStringParameters": {
    "validationToken": "<ValidationToken sent by Microsoft>"
}

我的API端点逻辑基于Microsoft的某些开发人员指南。特别是对于订阅创建,我是using this guide

看来这个问题是also asked but not answered on GitHub

1 个答案:

答案 0 :(得分:1)

我代表Microsoft Graph Web钩子团队......

我们在MS Graph服务日志中验证了您的请求,并确认在订阅验证阶段失败,因为HTTP状态代码=&#39;未授权&#39;来自你的终点......根据你的观察,一切都是正确的......

根据设计,MS Graph Web挂钩不会在订阅验证请求中发送clientState标头。在订阅验证期间请不要期望此标头。

更多信息

  1. 您可能希望在验证请求标头中收到clientState,因为Office365图表会将其发送给https://msdn.microsoft.com/en-us/office/office365/api/notify-rest-operations。 Office 365图表与MS Graph不同...
  2. https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/subscription_post_subscriptions处对此问题进行了一些文档改进...示例发布商通知有效负载,与订阅验证一起提及成功订阅后...我们修复了这些。