I am trying to read the URL query params from a POST coming into my Azure webhook (PowerShell).
My webhook is receiving a POST request such as:
Content-Type: text/plain; charset=utf-8
POST https://{notificationUrl}?validationToken={opaqueTokenCreatedByMicrosoftGraph}
As you may tease out, the context here is the creation of a Microsoft Graph subscription. However, I don't want to muddy up this post with too many details because I think my question is general enough: how to read POST params in an Azure webhook.
The runbook attached to this webhook (based on this one) apparently requires all the client data to come in via a single parameter called WebhookData
. I am able to read the WebhookName
, RequestBody
, and RequestHeader
inside WebhookData
. However, I don't know how to read the URL query parameter in the POST request that is reaching my webhook.
Specifically, I need to access that validationToken
. It doesn't show up in the WebhookData
. I've also tried removing the Webhookdata
param altogether from my runbook, but then absolutely nothing comes in. I've also tried adding a validationToken
param, alongside the WebhookData
param, but validationToken
comes out empty.
I should add that, along with the POST from Graph (which doesn't work), I am testing my runbook with Postman and making sure to include a validationToken
in the URL. Again, I can read it if I include it in the POST body, but not if it's a query param. And since ultimately Graph will be sending it via the query param, I think I have to get that to work first.
Very specifically, Azure Runbooks
, do not support query strings. From the documentation:
To receive data from the client, the runbook supports a single parameter called
WebhookData
. This parameter defines an object containing data that the client includes in a POST request.The
WebhookData
parameter has the following properties:
Property | Description |
---|---|
WebhookName | Name of the webhook. |
RequestHeader | Hashtable containing the headers of the incoming POST request. |
RequestBody | Body of the incoming POST request. This body keeps any data formatting, such as string, JSON, XML, or form-encoded. The runbook must be written to work with the data format that is expected. |
Azure Runbooks
has 2 parts to it, triggers and runbooks:
The Runbook
(Right Box) only accepts the single WebhookData
object to manage variable and data that Azure Runbooks
will operate with.
Webhooks
(Left Box), handles the triggering, receiving of data and passing it on to the Runbook
. Very specifically, the RequestBody
is specified as the:
Body of the incoming POST request. This body keeps any data formatting, such as string, JSON, XML, or form-encoded.This body keeps any data formatting, such as string, JSON, XML, or form-encoded.
With this definition, very specifically, even though WebHooks
can support query strings, in this case for triggering Azure Runbooks
they are explicitly ignored.
Aside, if the end desire is to subscribe to Microsoft Graph events, the "better" way is to use Event Hubs
to handle notifications:
Using Azure Event Hubs to receive change notifications differs from webhooks in a few ways, including:
- You don't rely on publicly exposed notification URLs. The Event Hubs SDK will relay the notifications to your application.
- You don't need to reply to the notification URL validation. You can ignore the validation message that you receive.
- You'll need to provision an Azure Event Hub.
- You'll need to provision an Azure Key Vault.