Compartir vía


Uso de claves simétricas a través de HTTPS sin un SDK

En este artículo de procedimientos, aprovisionará un dispositivo mediante claves simétricas a través de HTTPS sin usar un SDK de dispositivo de Azure IoT DPS. La mayoría de los lenguajes proporcionan bibliotecas para enviar solicitudes HTTP, pero, en lugar de centrarse en un lenguaje específico, en este artículo, usará la herramienta de línea de comandos cURL para enviar y recibir a través de HTTPS.

Puede seguir los pasos de este artículo en una máquina Linux o Windows. Si trabaja en Subsistema de Windows para Linux (WSL) o en una máquina Linux, puede escribir todos los comandos en el sistema local en un símbolo del sistema de Bash. Si trabaja en Windows, escriba todos los comandos del sistema local en un símbolo del sistema de GitBash.

Hay diferentes rutas en este artículo en función del tipo de entrada de inscripción que elija usar. Después de instalar los requisitos previos, asegúrese de leer la información general antes de continuar.

Requisitos previos

  • Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

  • Realice los pasos que se describen en Configuración de IoT Hub Device Provisioning Service con Azure Portal.

  • Asegúrese de que tiene Python 3.7 o una versión posterior instalada en la máquina. Puede comprobar la versión de Python ejecutando python --version.

  • Si trabaja en Windows, instale la versión más reciente de Git. Asegúrese de que Git se ha agregado a las variables de entorno accesibles desde la ventana de comandos. Consulte las herramientas de cliente de Git de Software Freedom Conservancy para instalar la versión más reciente de las herramientas git, lo que incluye Git Bash, la aplicación de línea de comandos que puede usar para interactuar con su repositorio de Git local. En Windows, escribirá todos los comandos en el sistema local en un símbolo del sistema de GitBash.

  • Azure CLI. Tiene dos opciones para ejecutar comandos de la CLI de Azure en este artículo:

    • Use Azure Cloud Shell, un shell interactivo que ejecuta comandos de la CLI en el explorador. Esta opción se recomienda porque no es necesario instalar nada. Si usa Cloud Shell por primera vez, inicie sesión en Azure Portal. Siga los pasos descritos en el inicio rápido de Cloud Shell para iniciar Cloud Shell y seleccionar el entorno Bash.
    • Opcionalmente, ejecute la CLI de Azure en su equipo local. Si la CLI de Azure ya está instalada, ejecute az upgrade para actualizar la CLI y las extensiones a la versión actual. Para instalar la CLI de Azure, consulte Instalación de la CLI de Azure.
  • Si trabaja en un entorno de Linux o WSL, abra un símbolo del sistema de Bash para ejecutar comandos localmente. Si trabaja en un entorno de Windows, abra un símbolo del sistema de GitBash.

Información general

En este artículo, puede usar una inscripción individual o un grupo de inscripción para aprovisionar a través de DPS.

Después de crear la entrada de grupo de inscripción o inscripción individual, continúe para crear un token de SAS y registrar el dispositivo con DPS.

Uso de una inscripción individual

Si quiere crear una nueva inscripción individual que se usará para este artículo, puede usar el comando az iot dps enrollment create para crear una inscripción individual para la atestación de clave simétrica.

El siguiente comando crea una entrada de inscripción con la directiva de asignación predeterminada para la instancia de DPS y permite a DPS asignar las claves principales y secundarias para el dispositivo:

az iot dps enrollment create -g {resource_group_name} --dps-name {dps_name} --enrollment-id {enrollment_id} --attestation-type symmetrickey
  • Sustituya el nombre del grupo de recursos y la instancia de DPS.

  • El identificador de inscripción es el identificador de registro del dispositivo. El id. de registro es una cadena que no distingue mayúsculas de minúsculas (de hasta 128 caracteres) de caracteres alfanuméricos más los caracteres especiales: '-', '.', '_', ':'. El último carácter debe ser alfanumérico o un guion ('-'). Asegúrese de que el identificador de inscripción que usa en el comando cumple este formato.

Las claves simétricas asignadas se devuelven en la propiedad de atestación en la respuesta:


{
  "allocationPolicy": null,
  "attestation": {
    "symmetricKey": {
      "primaryKey": "G3vn0IZH9oK3d4wsxFpWBtd2KUrtjI+39dZVRf26To8w9OX0LaFV9yZ93ELXY7voqHEUsNhnb9bt717UP87KxA==",
      "secondaryKey": "4lNxgD3lUAOEOied5/xOocyiUSCAgS+4b9OvXLDi8ug46/CJzIn/3rN6Ys6gW8SMDDxMQDaMRnIoSd1HJ5qn/g=="
    },
    "tpm": null,
    "type": "symmetricKey",
    "x509": null
  },

  ...

}

Anote la clave principal y el identificador de registro (id. de inscripción) para la entrada de inscripción individual, los usará más adelante en este artículo.

Si desea usar una inscripción individual existente para este artículo, puede obtener la clave principal con el comando az iot dps enrollment show:

az iot dps enrollment show -g {resource_group_name} --dps-name {dps_name} --enrollment-id {enrollment_id} --show-keys true

Uso de un grupo de inscripción

Si desea crear un nuevo grupo de inscripción para usar para este artículo, puede usar el comando az iot dps enrollment-group create para crear un grupo de inscripción para la atestación de clave simétrica.

El siguiente comando crea una entrada de grupo de inscripción con la directiva de asignación predeterminada para la instancia de DPS y permite a DPS asignar las claves principales y secundarias para el grupo de inscripción:

az iot dps enrollment-group create -g {resource_group_name} --dps-name {dps_name} --enrollment-id {enrollment_id}
  • Sustituya el nombre del grupo de recursos y la instancia de DPS.

  • El id. de inscripción es una cadena que no distingue mayúsculas de minúsculas (de hasta 128 caracteres) de caracteres alfanuméricos más los caracteres especiales: '-', '.', '_', ':'. El último carácter debe ser alfanumérico o un guion ('-'). Puede ser cualquier nombre que elija usar para el grupo de inscripción.

Las claves simétricas asignadas se devuelven en la propiedad de atestación en la respuesta:


{
  "allocationPolicy": null,
  "attestation": {
    "symmetricKey": {
      "primaryKey": "G3vn0IZH9oK3d4wsxFpWBtd2KUrtjI+39dZVRf26To8w9OX0LaFV9yZ93ELXY7voqHEUsNhnb9bt717UP87KxA==",
      "secondaryKey": "4lNxgD3lUAOEOied5/xOocyiUSCAgS+4b9OvXLDi8ug46/CJzIn/3rN6Ys6gW8SMDDxMQDaMRnIoSd1HJ5qn/g=="
    },
    "tpm": null,
    "type": "symmetricKey",
    "x509": null
  },

  ...

}

Anote la clave principal.

Si desea usar una inscripción individual existente para este artículo, puede obtener la clave principal con el comando az iot dps enrollment-group show:

az iot dps enrollment-group show -g {resource_group_name} --dps-name {dps_name} --enrollment-id {enrollment_id} --show-keys true

Derivación de una clave de dispositivo

Al usar la atestación de clave simétrica con las inscripciones de grupos, no se usan las claves de grupo de inscripción directamente. En su lugar, se deriva una clave única de la clave del grupo de inscripción para cada dispositivo. Para obtener más información, vea Agrupación de inscripciones con claves simétricas.

En esta parte del tutorial, generará una clave de dispositivo a partir de la clave maestra del grupo para calcular un HMAC-SHA256 del identificador de registro único para el dispositivo. A continuación, el resultado se convertirá al formato Base64.

  1. Genere la clave única mediante openssl. Usará el siguiente script de shell de Bash. Reemplace {primary-key} por la clave principal del grupo de inscripción que copió anteriormente y reemplace {contoso-simdevice} por el identificador de registro que desea usar para el dispositivo. El id. de registro es una cadena que no distingue mayúsculas de minúsculas (de hasta 128 caracteres) de caracteres alfanuméricos más los caracteres especiales: '-', '.', '_', ':'. El último carácter debe ser alfanumérico o un guion ('-').

    KEY={primary-key}
    REG_ID={contoso-simdevice}
    
    keybytes=$(echo $KEY | base64 --decode | xxd -p -u -c 1000)
    echo -n $REG_ID | openssl sha256 -mac HMAC -macopt hexkey:$keybytes -binary | base64
    
  2. El script generará una salida similar a la clave siguiente:

    p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=
    

Anote la clave de dispositivo derivada y el identificador de registro que usó para generarla, los usará en la sección siguiente.

También puede usar la CLI de Azure o PowerShell para derivar una clave de dispositivo. Para más información, consulte Derivar una clave de dispositivo.

Creación de un token de SAS

Al usar la atestación de clave simétrica, los dispositivos se autentican con DPS mediante un token de firma de acceso compartido (SAS). Para el aprovisionamiento de dispositivos a través de una inscripción individual, el token se firma mediante la clave principal o secundaria establecida en la entrada de inscripción. Para un aprovisionamiento de dispositivos a través de un grupo de inscripción, el token se firma mediante una clave de dispositivo derivada, que, a su vez, se ha generado mediante la clave principal o secundaria establecida en la entrada del grupo de inscripción. El token especifica una hora de expiración y un URI de recurso de destino.

El siguiente script de Python se puede usar para generar un token de SAS:

from base64 import b64encode, b64decode
from hashlib import sha256
from time import time
from urllib.parse import quote_plus, urlencode
from hmac import HMAC

def generate_sas_token(uri, key, policy_name, expiry=3600):
     ttl = time() + expiry
     sign_key = "%s\n%d" % ((quote_plus(uri)), int(ttl))
     print(sign_key)
     signature = b64encode(HMAC(b64decode(key), sign_key.encode('utf-8'), sha256).digest())

     rawtoken = {
         'sr' :  uri,
         'sig': signature,
         'se' : str(int(ttl))
     }

     if policy_name is not None:
         rawtoken['skn'] = policy_name

     return 'SharedAccessSignature ' + urlencode(rawtoken)

uri = '[resource_uri]'
key = '[device_key]'
expiry = [expiry_in_seconds]
policy= '[policy]'

print(generate_sas_token(uri, key, policy, expiry))

Donde:

  • [resource_uri] es el URI del recurso al que intenta acceder con este token. Para DPS, tiene el formato [dps_id_scope]/registrations/[dps_registration_id], donde [dps_id_scope] es el ámbito de identificador de la instancia de DPS y [dps_registration_id] es el identificador de registro que usó para el dispositivo.

    Puede obtener el ámbito de identificador de la instancia de DPS en el panel Información general de la instancia en Azure Portal, o bien puede usar el comando az iot dps show de la CLI de Azure (reemplace los marcadores de posición por el nombre del grupo de recursos y la instancia de DPS):

    az iot dps show -g {resource_group_name} --name {dps_name}
    
  • [device_key] es la clave de dispositivo asociada al dispositivo. Esta clave es la especificada o generada automáticamente para usted en una inscripción individual o una clave derivada para una inscripción de grupo.

  • [expiry_in_seconds] es el período de validez de este token de SAS en segundos.

  • [policy] es la directiva con la que está asociada la clave de dispositivo. Para el registro de dispositivos DPS, la directiva está codificada de forma rígida en "registro".

Un conjunto de entradas de ejemplo para un dispositivo denominado my-symkey-device con un período de validez de 30 días podría tener este aspecto.

uri = '0ne00111111/registrations/my-symkey-device'
key = '18RQk/hOPJR9EbsJlk2j8WA6vWaj/yi+oaYg7zmxfQNdOyMSu+SJ8O7TSlZhDJCYmn4rzEiVKIzNiVAWjLxrGA=='
expiry = 2592000
policy='registration'

Modifique el script para el dispositivo y la instancia de DPS y guárdelo como un archivo de Python; por ejemplo, generate_token.py. Ejecute el script, por ejemplo, python generate_token.py. Debería generar un token de SAS similar al siguiente:

0ne00111111%2Fregistrations%2Fmy-symkey-device
1663952627
SharedAccessSignature sr=0ne00111111%2Fregistrations%2Fmy-symkey-device&sig=eNwg52xQdFTNf7bgPAlAJBCIcONivq%2Fck1lf3wtxI4A%3D&se=1663952627&skn=registration

Copie y guarde toda la línea que comienza por SharedAccessSignature. Esta línea es el token de SAS. La necesitará en los pasos siguientes.

Para más información sobre el uso de tokens de SAS con DPS y su estructura, consulte Control del acceso a DPS con SAS.

Registro del dispositivo

Llame a la API de REST Registrar dispositivo para aprovisionar el dispositivo a través de DPS.

Use el siguiente comando cURL:

curl -L -i -X PUT -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: [sas_token]' -d '{"registrationId": "[registration_id]"}' https://global.azure-devices-provisioning.net/[dps_id_scope]/registrations/[registration_id]/register?api-version=2019-03-31

Donde:

  • -L indica a cURL que siga las redirecciones HTTP.

  • –i indica a cURL que incluya encabezados de protocolo en la salida. Estos encabezados no son estrictamente necesarios, pero pueden ser útiles.

  • -X PUT indica a cURL que se trata de un comando HTTP PUT. Necesario para esta llamada API.

  • -H 'Content-Type: application/json' indica a DPS que publicamos contenido JSON y debe ser 'application/json'.

  • -H 'Content-Encoding: utf-8' indica a DPS la codificación que usamos para el cuerpo del mensaje. Establezca en el valor adecuado para el sistema operativo o el cliente; sin embargo, generalmente es utf-8.

  • -H 'Authorization: [sas_token]' indica a DPS que se autentique mediante el token de SAS. Reemplace [sas_token] por el token que generó en Creación de un token de SAS.

  • -d '{"registrationId": "[registration_id]"}', el parámetro –d son los "datos" o el cuerpo del mensaje que estamos publicando. Debe ser JSON, en forma de '{"registrationId":"[registration_id"}'. Tenga en cuenta que para cURL, está entre comillas simples; de lo contrario, debe aplicar escape a las comillas dobles en el JSON.

  • Por último, el último parámetro es la dirección URL a la que se va a publicar. Para DPS "normal" (es decir, no local), se usa el punto de conexión global de DPS, global.azure-devices-provisioning.net: https://global.azure-devices-provisioning.net/[dps_id_scope]/registrations/[registration_id]/register?api-version=2019-03-31. Tenga en cuenta que tiene que reemplazar [dps_scope_id] y [registration_id] por los valores adecuados.

Por ejemplo:

curl -L -i -X PUT -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: SharedAccessSignature sr=0ne00111111%2Fregistrations%2Fmy-symkey-device&sig=eNwg52xQdFTNf7bgPAlAJBCIcONivq%2Fck1lf3wtxI4A%3D&se=1663952627&skn=registration' -d '{"registrationId": "my-symkey-device"}' https://global.azure-devices-provisioning.net/0ne00111111/registrations/my-symkey-device/register?api-version=2021-06-01

Una llamada correcta tendrá una respuesta similar a la siguiente:

HTTP/1.1 202 Accepted
Date: Wed, 31 Aug 2022 22:02:49 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Location: https://global.azure-devices-provisioning.net/0ne00111111/registrations/my-symkey-device/register
Retry-After: 3
x-ms-request-id: a021814f-0cf6-4ce9-a1e9-ead7eb5118d9
Strict-Transport-Security: max-age=31536000; includeSubDomains

{"operationId":"5.316aac5bdc130deb.b1e02da8-c3a0-4ff2-a121-7ea7a6b7f550","status":"assigning"}

La respuesta contiene un identificador de operación y un estado. En este caso, el estado se establece en assigning. La inscripción de DPS es, potencialmente, una operación de larga duración, por lo que se realiza de forma asincrónica. Normalmente, sondeará el estado mediante la API de REST de Búsqueda de estado de la operación para determinar cuándo se ha asignado el dispositivo o si se ha producido un error.

Los valores de estado válidos para DPS son:

  • assigned: el valor devuelto de la llamada de estado indicará a qué IoT Hub se asignó el dispositivo.

  • assigning: la operación todavía está en curso.

  • disabled: el registro de inscripción está deshabilitado en DPS, por lo que no se puede asignar el dispositivo.

  • failed: no se pudo realizar la asignación. Habrá un errorCode y errorMessage devueltos en un registro registrationState en la respuesta para indicar lo que ha fallado.

  • unassigned

Para llamar a la API de Búsqueda de estado de la operación, use el siguiente comando cURL:

curl -L -i -X GET -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: [sas_token]' https://global.azure-devices-provisioning.net/[dps_id_scope]/registrations/[registration_id]/operations/[operation_id]?api-version=2019-03-31

Usará el mismo ámbito de identificador, identificador de registro y token de SAS que hizo en la solicitud Registrar dispositivo. Use el identificador de operación que se devolvió en la respuesta Registrar dispositivo.

Por ejemplo:

curl -L -i -X GET -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: SharedAccessSignature sr=0ne00111111%2Fregistrations%2Fmy-symkey-device&sig=eNwg52xQdFTNf7bgPAlAJBCIcONivq%2Fck1lf3wtxI4A%3D&se=1663952627&skn=registration' https://global.azure-devices-provisioning.net/0ne00111111/registrations/my-symkey-device/operations/5.316aac5bdc130deb.f4f1828c-4dab-4ca9-98b2-dfc63b5835d6?api-version=2021-06-01

En la salida siguiente se muestra la respuesta de un dispositivo que se ha asignado correctamente. Observe que la propiedad status es assigned y que la propiedad registrationState.assignedHub se establece en el centro de IoT donde se aprovisionó el dispositivo.

HTTP/1.1 200 OK
Date: Wed, 31 Aug 2022 22:05:23 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
x-ms-request-id: ffb98d42-023e-4e75-afb0-1807ff091cbb
Strict-Transport-Security: max-age=31536000; includeSubDomains

{
   "operationId":"5.316aac5bdc130deb.b1e02da8-c3a0-4ff2-a121-7ea7a6b7f550",
   "status":"assigned",
   "registrationState":{
      "registrationId":"my-symkey-device",
      "createdDateTimeUtc":"2022-08-31T22:02:50.5163352Z",
      "assignedHub":"MyExampleHub.azure-devices.net",
      "deviceId":"my-symkey-device",
      "status":"assigned",
      "substatus":"initialAssignment",
      "lastUpdatedDateTimeUtc":"2022-08-31T22:02:50.7370676Z",
      "etag":"IjY5MDAzNTUyLTAwMDAtMDMwMC0wMDAwLTYzMGZkYThhMDAwMCI="
   }
}

Envío de un mensaje de telemetría

Para poder enviar un mensaje de telemetría, debe crear un token de SAS para el centro de IoT al que se asignó el dispositivo. Firma este token con la misma clave principal o clave de dispositivo derivada que usó para firmar el token de SAS para la instancia de DPS.

Creación de un token de SAS para centro de IoT

Para crear el token de SAS, puede ejecutar el mismo código que hizo para crear el token para la instancia de DPS con los siguientes cambios:

uri = '[resource_uri]'
key = '[device_key]'
expiry = [expiry_in_seconds]
policy= None

Donde:

  • [resource_uri] es el URI del recurso al que intenta acceder con este token. Para un dispositivo que envía mensajes a un centro de IoT, tiene el formato [iot-hub-host-name]/devices/[device-id].

    • Para [iot-hub-host-name], use el nombre de host de IoT Hub devuelto en la propiedad assignedHub de la sección anterior.

    • Para [device-id], use el identificador de dispositivo devuelto en la propiedad deviceId de la sección anterior.

  • [device_key] es la clave de dispositivo asociada al dispositivo. Esta clave es la especificada o generada automáticamente para usted en una inscripción individual o una clave derivada para una inscripción de grupo. (Es la misma clave que usó anteriormente para crear un token para DPS).

  • [expiry_in_seconds] es el período de validez de este token de SAS en segundos.

  • policy=None No se requiere ninguna directiva para un dispositivo que envía telemetría a un centro de IoT, por lo que este parámetro se establece en None.

Un conjunto de entradas de ejemplo para un dispositivo llamado my-symkey-device que envía a un IoT Hub denominado MyExampleHub con un período de validez de token de una hora podría tener este aspecto:

uri = 'MyExampleHub.azure-devices.net/devices/my-symkey-device'
key = '18RQk/hOPJR9EbsJlk2j8WA6vWaj/yi+oaYg7zmxfQNdOyMSu+SJ8O7TSlZhDJCYmn4rzEiVKIzNiVAWjLxrGA=='
expiry = 3600
policy= None

En la salida siguiente se muestra un token de SAS de ejemplo para estas entradas:

SharedAccessSignature sr=MyExampleHub.azure-devices.net%2Fdevices%2Fmy-symkey-device&sig=f%2BwW8XOKeJOtiPc9Iwjc4OpExvPM7NlhM9qxN2a1aAM%3D&se=1663119026

Para más información sobre cómo crear tokens de SAS para IoT Hub, incluido el código de ejemplo en otros lenguajes de programación, consulte Control del acceso a IoT Hub mediante firmas de acceso compartido.

Nota:

Por comodidad, puede usar el comando az iot hub generate-sas-token de la CLI de Azure para obtener un token de SAS para un dispositivo registrado con un centro de IoT. Por ejemplo, el siguiente comando genera un token de SAS con una duración de una hora. Para {iothub_name}, solo necesita la primera parte del nombre del host, por ejemplo, MyExampleHub.

az iot hub generate-sas-token -d {device_id} -n {iothub_name}

Envío de datos al centro de IoT

Para enviar telemetría al dispositivo, llame a la API de REST Enviar evento de dispositivo de IoT Hub.

Use el siguiente comando cURL:

curl -L -i -X POST -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: [sas_token]' -d '{"temperature": 30}' https://[assigned_iot_hub_name].azure-devices.net/devices/[device_id]/messages/events?api-version=2020-03-13

Donde:

  • -X POST indica a cURL que se trata de un comando HTTP POST. Necesario para esta llamada API.

  • -H 'Content-Type: application/json' indica a IoT Hub que estamos publicando contenido JSON y debe ser 'application/json'.

  • -H 'Content-Encoding: utf-8' indica a IoT Hub la codificación que usamos para el cuerpo del mensaje. Establezca en el valor adecuado para el sistema operativo o el cliente; sin embargo, generalmente es utf-8.

  • -H 'Authorization: [sas_token]' indica a IoT Hub que se autentique mediante el token de SAS. Reemplace [sas_token] por el token que generó para el centro de IoT asignado.

  • -d '{"temperature": 30}', el parámetro –d son los "datos" o el cuerpo del mensaje que estamos publicando. En este artículo, vamos a publicar un único punto de datos de temperatura. El tipo de contenido se especificó como application/json, por lo que, para esta solicitud, el cuerpo es JSON. Tenga en cuenta que para cURL, está entre comillas simples; de lo contrario, debe aplicar escape a las comillas dobles en el JSON.

  • El último parámetro es la dirección URL a la que se va a publicar. Para la API de Enviar evento de dispositivo, la dirección URL es: https://[assigned_iot_hub_name].azure-devices.net/devices/[device_id]/messages/events?api-version=2020-03-13.

    • Reemplace [assigned_iot_hub_name] por el nombre del centro de IoT al que se asignó el dispositivo.

    • Reemplace [device_id] por el identificador de dispositivo que se asignó al registrar el dispositivo. En el caso de los dispositivos que aprovisionan a través de grupos de inscripción, el identificador de dispositivo será el identificador de registro. En el caso de las inscripciones individuales, puede especificar, opcionalmente, un identificador de dispositivo diferente al identificador de registro en la entrada de inscripción.

Por ejemplo, para un dispositivo con un identificador de dispositivo my-symkey-device que envía un punto de datos de telemetría a un centro de IoT denominado MyExampleHub:

curl -L -i -X POST -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: SharedAccessSignature sr=MyExampleHub.azure-devices.net%2Fdevices%2Fmy-symkey-device&sig=f%2BwW8XOKeJOtiPc9Iwjc4OpExvPM7NlhM9qxN2a1aAM%3D&se=1663119026' -d '{"temperature": 30}' https://MyExampleHub.azure-devices.net/devices/my-symkey-device/messages/events?api-version=2020-03-13

Una llamada correcta tendrá una respuesta similar a la siguiente:

HTTP/1.1 204 No Content
Content-Length: 0
Vary: Origin
Server: Microsoft-HTTPAPI/2.0
x-ms-request-id: 9e278582-3561-417b-b807-76426195920f
Date: Wed, 14 Sep 2022 00:32:53 GMT

Pasos siguientes