使用Microsoft Graph创建Webhook订阅时验证请求未触发问题
我之前在搭建Graph Webhook订阅时也碰到过一模一样的情况,给你整理几个关键排查方向,应该能帮你定位问题:
检查服务器防火墙/WAF的IP白名单
虽然你用在线工具能访问验证端点,但Microsoft Graph的请求是从特定IP范围发出的。如果你的服务器防火墙或WAF没有把这些IP加入白名单,请求会直接被拦截。你需要核对微软官方公布的Graph服务IP范围,确保这些IP能正常访问你的验证URL。确认验证URL的有效性
微软对notificationUrl有严格要求:- 必须是HTTPS协议,且使用受信任CA颁发的有效证书(自签名证书会被拒绝);
- URL不能包含任何重定向,必须直接指向处理验证请求的端点;
- 检查URL拼写,比如路径、域名有没有大小写错误或者多余字符。
验证服务器对验证请求的响应是否合规
当Microsoft Graph发送验证请求时,会在查询参数里带上validationToken,你的服务器必须原封不动地将这个token作为响应体返回,同时返回200 OK状态码。如果你的服务器返回的是自定义页面、JSON或者其他内容,微软会判定验证失败,不会继续发送请求。你可以模拟一个带validationToken参数的GET请求到你的端点,确认返回的就是这个token本身。检查订阅请求的参数是否正确
确保你发送到https://graph.microsoft.com/v1.0/subscriptions的POST请求里,必填参数都正确:changeType:必须是符合资源类型的有效值(比如created,updated);resource:要订阅的Graph资源路径必须正确(比如/me/mailFolders('Inbox')/messages);expirationDateTime:不能超过微软允许的最大期限(当前针对大多数资源是4230分钟,也就是70.5小时),也不能设置为过去的时间。
查看订阅创建后的状态
发送POST请求后,检查返回的JSON响应里的status字段:- 如果是
pendingVerification:说明验证流程还没完成,大概率是前面的响应或URL问题; - 如果是
enabled但仍未收到请求:可以尝试触发一次对应资源的变更(比如发一封邮件到订阅的收件箱),然后再检查服务器日志。
- 如果是
深挖服务器日志细节
除了常规的请求访问日志,还要查看防火墙的拒绝日志、Web服务器的错误日志,有没有来自微软IP的连接被拒绝、超时或者其他错误记录,这些往往能直接定位问题。
内容的提问来源于stack exchange,提问作者Gavin

