В настоящее время я подписываюсь на события календаря с:
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
с состояниемотправлено в запросе на создание подписки?
После того, как я отправил запрос на подписку, сервер отправил мне сообщение проверки.Чего мне не хватает, так это ClientState
в запросе проверки от Microsoft Graph.
В документации под уведомления об изменениях запрос описан так:
POST https://{notificationUrl}?validationToken={TokenDefinedByMicrosoftGraph}
ClientState: {Data sent in ClientState value in subscription request (if any)}
К сожалению, я не могу найти состояние клиента в теле запроса проверки (или любой другой части).
Правильно ли объявлено состояние клиента?
Если да, почему ClientState
отсутствует в запросе проверки, как описано в документации (поскольку это представляется важным по соображениям безопасности)?
Редактировать:
Я использую ngrok для тестирования своих веб-крючков.Необработанные данные сообщения о проверке токена, которое я получаю, выглядят так:
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"
}
]
}