我尝试为Azure用户数据(https://docs.microsoft.com/en-us/graph/webhooks)中的更改设置通知。
我从本地客户端向Azure Graph API发送请求,我在请求的有效负载中有一个公共服务器(带有SSL)作为通知URL。
Azure现在向我的服务器发送一个帖子请求(如文档中所示 - 确切的帖子请求见下文),我尝试发送我得到的令牌(如文档中所示)。但我总是收到以下错误消息“订阅验证请求失败。响应必须与validationToken查询参数完全匹配。”
来自Azure的发布请求:
Path: /?validationToken=Validation%3a+Testing+client+application+reachability+for+subscription+Request-Id%3a+3b3f9821-ce3f-23d9-879b-00a23f3
Body: is empty
我尝试了路径的每个部分和编码(就像请求ID或整个路径),但我总是得到错误消息。那么发回的权利是什么?
首先,您收到的验证令牌应被视为不透明值并返回不变,错误Subscription validation request failed. Response must exactly match validationToken query parameter
试图告诉您更改了某些内容。
由于验证令牌是作为URL查询参数提供给您的,因此请确保在返回之前在代码中使用正确解码的值。
以下是Microsoft Docs:Notification endpoint validation的相关文档
POST https://{notificationUrl}?validationToken={opaqueTokenCreatedByMicrosoftGraph}
其他要求(来自同一参考文献):
代码示例
ASP.NET MVC Sample - 具体看一下NotificationController.cs文件
[HttpPost]
public async Task<ActionResult> Listen()
{
// Validate the new subscription by sending the token back to Microsoft Graph.
// This response is required for each subscription.
if (Request.QueryString["validationToken"] != null)
{
var token = Request.QueryString["validationToken"];
return Content(token, "plain/text");
}
Node.js code sample - 具体看看listen.js
/* Default listen route */
listenRouter.post('/', (req, res, next) => {
let status;
let clientStatesValid;
// If there's a validationToken parameter in the query string,
// then this is the request that Office 365 sends to check
// that this is a valid endpoint.
// Just send the validationToken back.
if (req.query && req.query.validationToken) {
res.send(req.query.validationToken);
// Send a status of 'Ok'
status = 200;
}
您应该使用validationToken
响应代码从查询字符串返回HTTP 200
。您还必须在几秒钟内完成此操作,否则图表将无法通过请求,您创建订阅的调用将失败。
以下是ASP.NET Web API 2中验证端点的示例:
public ActionResult<string> Post([FromQuery]string validationToken = null)
{
if(!string.IsNullOrEmpty(validationToken))
{
Console.WriteLine($"Token: '{validationToken}'");
return Ok(validationToken);
}
}