【发布时间】:2018-05-29 09:39:40
【问题描述】:
我目前正在通过以下方式订阅日历活动:
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 来测试我的 webhook。我收到的验证令牌发布消息的原始数据如下所示:
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"
}
]
}
【问题讨论】:
-
您能否包含您正在返回的有效负载?您可能想使用 Fiddler 之类的东西在写入时立即嗅探它,而不是尝试为它解析日志。
-
@MarcLaFleur 我正在使用 ngrok 进行测试,并在其 Web 界面中发布了验证令牌发布请求的原始数据。希望这会有所帮助。
-
我很确定这是文档中的错误,并且 clientState 未在验证请求中发送。我看到了同样的行为。我正在与 Graph 开发人员再次核对以确认。
-
如果文档中有错误,我可能会问为什么不包括在内。我认为只回答我自己的验证令牌请求(用我的客户端状态标识它们)是很重要的。
-
我的直觉反应和你一样。看起来您肯定希望
clientState作为验证的一部分返回;特别是如果您将附加信息编码为到clientState以连接这些点。话虽如此,我的直觉在过去可能多次出错,所以很可能有充分的理由不发送此邮件。