如何使用MSgraph处理webhook验证请求?

2024-04-28 12:49:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在Microsoft azure中注册我的web应用,以获得有关用户一次驱动器更改的通知。为此,我需要注册我的应用程序,以获得通知。你知道吗

我一直遵循这些指示:Create subscription

这里是Handling webhook validation requests

但是我需要一些帮助来验证webhook。 创建新订阅时,OneDrive将以以下格式向注册的URL(我的web应用或可能我将使用azure函数)发布请求:

POST https://contoso.azurewebsites.net/your/webhook/service?validationtoken={randomString}

Content-Length: 0

为了成功创建订阅,我的服务必须通过将validationtoken查询字符串参数的值作为纯文本响应返回来响应此请求。你知道吗

HTTP/1.1 200 OK
Content-Type: text/plain

{randomString}

我使用的是django,我如何像他们问的那样用python做出响应?你知道吗

这是我发送第一个post请求的方式

def create_subscription(token):
  payload = {
    "changeType": "updated",
    "notificationUrl": notification_url,
    "resource": "/me/drive/root",
    "expirationDateTime": "2030-01-01T11:23:00.000Z",
    "clientState": "client-specific string"
  }

  headers = {
    "Authorization": token['access_token'],
    "Host": "graph.microsoft.com",
    "Content-Type": "application/json"
  }

  response = requests.post("https://graph.microsoft.com/v1.0/subscriptions".format(graph_url),
                           data=json.dumps(payload), headers=headers)

这就是我如何对微软的POST请求做出响应的

def validate_subscription(request):

    if request.method == 'POST':
      url = request.get_full_path()
      parsed = urlparse.urlparse(url)
      validation_string = parsed.query['validationtoken']

      headers = {
        "Host": "graph.microsoft.com",
        "Content-Type": "text/plain"
      }
      r = requests.post("{0}/subscriptions".format(graph_url),
                           data=validation_string, headers=headers)
      if (r.status_code == 200):
        return HttpResponse("Subscription suceeded")

我们不断收到错误,上面写着“验证错误”

谢谢你们


Tags: tokenurlstringtypewebhookcontentpostrequests
2条回答

因此,我所做的是使用大写字母“v”作为“validationtoken”,因此请求应该如下所示:

def validate_subscription(request):

if request.method == 'POST':
  url = request.get_full_path()
  parsed = urlparse.urlparse(url)
  validation_string = parsed.query['Validationtoken']

  headers = {
    "Host": "graph.microsoft.com",
    "Content-Type": "text/plain"
  }
  r = requests.post("{0}/subscriptions".format(graph_url),
                       data=validation_string, headers=headers)
  if (r.status_code == 200):
    return HttpResponse("Subscription suceeded")

您不应该将POST请求发送回Graph,您应该使用它传入的令牌响应Graph的请求:

  1. 创建订阅
  2. Graph使用验证令牌向通知端点发出POST。你知道吗
  3. 通知端点对POST的响应如下:

    def validate_subscription(request):
        if request.method == 'POST':
            url = request.get_full_path()
            parsed = urlparse.urlparse(url)
            validation_string = parsed.query['validationtoken']
            return HttpResponse(validation_string, content_type="text/plain")
    

相关问题 更多 >