我目前正在订阅日历活动:
var request = graphClient.Subscriptions.Request();
var result = await request.AddAsync(
new Subscription {
ChangeType = "created,updated,deleted",
NotificationUrl = notificationUrl,
Resource = "/users/" + userId + "/" + resource,
ExpirationDateTime = DateTimeOffset.UtcNow.AddMinutes(4230),
ClientState = "my-subscription-identifier"
}
);
可以声明ClientState
,因此当收到通知时,我可以通过将ClientState
与创建订阅请求中发送的状态进行比较来处理它吗?
发送订阅请求后,服务器会向我发送验证消息。
我缺少的是Microsoft Graph验证请求中的ClientState
。
在change notifications下的文档中,请求描述如下:
POST https://{notificationUrl}?validationToken={TokenDefinedByMicrosoftGraph} ClientState: {Data sent in ClientState value in subscription request (if any)}
不幸的是,我无法在验证请求(或任何其他部分)的正文中找到客户端状态。
客户端状态声明是否正确?
如果是,为什么ClientState
不在验证请求中
在文档中描述(因为它似乎对安全性很重要
原因)?
修改
我使用ngrok测试我的webhooks。我收到的验证令牌发布消息的原始数据如下所示:
POST /?validationToken=NmMwNjE5YjAtNzc3Zi00NmMwLWI1ZmYtYjJiNWI5NzU0MGY5
HTTP/1.1
Host: localhost:12345
User-Agent: Go-http-client/1.1
Content-Length: 0
Content-Type: text/plain; charset=utf-8
X-Forwarded-For:
X-Forwarded-Proto: https
X-Original-Host: 5a665085.eu.ngrok.io
如果我收到更新通知,例如请求正文如下所示:
{
"value": [
{
"subscriptionId": "de6c71b...",
"subscriptionExpirationDateTime": "2018-06-02T05:11:28.6421943+00:00",
"changeType": "updated",
"resource": "Users/9c4661.../Events/AQMkAGY4Y2E0YjZiLTA4ZDctNGJ...",
"resourceData": {
"@odata.type": "#Microsoft.Graph.Event",
"@odata.id": "Users/9c4661.../Events/AQMkAGY4Y2E0YjZiLTA4ZDctNGJ...",
"@odata.etag": "W/\"DwAAABYAAABzyrM9Qi...\"",
"id": "AQMkAGY4Y2E0YjZiLTA4ZDctNGJ..."
},
"clientState": "my-subscription-identifier"
}
]
}
答案 0 :(得分:2)
初始验证的目标是让Microsoft验证客户端的通知URL:它已启动且响应迅速,并且可以接受通知。
验证意味着无副作用且不披露任何信息。
到目前为止,我们还没有遇到过包含clientState有用的场景,这就是为什么我们不将它包含在验证请求中。
如果您有一个案例,其中包含此请求中的更多信息会有用(例如,作为更大的场景/工作流程的一部分),您可以简要描述一下吗?
注意:我们很快会更新文档以与API行为保持一致。