【问题标题】:No ClientState in Webhook Subscription validation messageWebhook 订阅验证消息中没有 ClientState
【发布时间】: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 以连接这些点。话虽如此,我的直觉在过去可能多次出错,所以很可能有充分的理由不发送此邮件。

标签: c# microsoft-graph-api


【解决方案1】:

初始验证的目标是让 Microsoft 验证客户端的通知 URL:它已启动且响应迅速,并且可以接受通知。

验证旨在无副作用且不泄露任何信息。

到目前为止,我们还没有遇到包含 clientState 有用的场景,这就是为什么我们不在验证请求中包含它的原因。

如果您认为在此请求中包含更多信息会很有用(例如,作为更大场景/工作流程的一部分),您能否简要描述一下?

注意:我们将很快更新文档以与 API 行为保持一致。

【讨论】:

  • 感谢您的澄清。我基本上想订阅多个用户。我认为客户端状态将帮助我识别请求是否实际上来自我的应用程序。以不同方式处理未知或丢失的客户端状态似乎很有用(例如,发回 HttpStatusCode 400 而不是 200 或只是忽略它)。这将防止我的服务器必须处理(可能很多)外部通知。它不会破坏服务器,但似乎是不必要的负载。
  • 在我的情况下,我已经有一个巨大的通知负载,因为我订阅了许多不同的用户(1000+)。
猜你喜欢
  • 2020-06-08
  • 2017-08-15
  • 2019-01-17
  • 2017-08-11
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
相关资源
最近更新 更多