Introducción a las solicitudes WebSocket de conexiones híbridas de Relay en Python
En esta guía de inicio rápido, creará aplicaciones de remitente y receptor de Python que envían y reciben mensajes mediante el protocolo WebSocket. Las aplicaciones usan la característica Conexiones híbridas de Azure Relay. Para información acerca de Azure Relay en general, consulte Azure Relay.
En esta guía de inicio rápido, realizará los siguientes pasos:
- Creación de un espacio de nombres de Relay mediante Azure Portal.
- Creación de una conexión híbrida en dicho espacio de nombres mediante Azure Portal.
- Generación de un archivo de propiedades de config.json para almacenar los detalles de la conexión
- Desarrollo de un relaylib.py para funciones auxiliares (tokens de SAS, direcciones URL)
- Escriba un script de servidor (cliente de escucha) para recibir mensajes.
- Escriba un script de cliente (emisor) para enviar mensajes.
- Ejecute el script del servidor (cliente de escucha) y, opcionalmente, el script de cliente (emisor).
Requisitos previos
- Python Asegúrese de que está ejecutando Python 3.10+
- Suscripción a Azure. Si no tiene una, cree una cuenta gratuita antes de empezar.
Creación de un espacio de nombres mediante Azure Portal
Inicie sesión en Azure Portal.
Seleccione Todos los servicios en el menú de la izquierda. Seleccione Integración, busque Retransmisiones, mueva el mouse sobre Retransmisiones y, a continuación, seleccione Crear.
En la página Crear espacio de nombres, siga estos pasos:
Elija la suscripción de Azure en la que se va a crear el espacio de nombres.
En Grupo de recursos, elija un grupo de recursos existente en el que se colocará el espacio de nombres o cree uno.
Escriba un nombre para el espacio de nombres de Retransmisión.
Seleccione la región donde se debe hospedar el espacio de nombres.
En la parte inferior de la página, seleccione Revisar y crear.
En la página Revisar y crear, seleccione Crear.
Al cabo de unos minutos, verá la página Retransmisión del espacio de nombres.
Obtención de las credenciales de administración
En la página Retransmisión, seleccione Directivas de acceso compartido en el menú de la izquierda.
En la página Directivas de acceso compartido, seleccione RootManageSharedAccessKey.
En Directiva SAS: RootManageSharedAccessKey, haga clic en el botón Copiar situado junto a Cadena de conexión principal. Esta acción copia la cadena de conexión en el Portapapeles para su uso posterior. Pegue este valor en el Bloc de notas o cualquier otra ubicación temporal.
Repita el paso anterior para copiar y pegar el valor de Clave principal en una ubicación temporal para su uso posterior.
Creación de una conexión híbrida mediante Azure Portal
En la página Relay del espacio de nombres, siga estos pasos para crear una conexión híbrida.
En el menú de la izquierda, en Entidades, seleccione Conexiones híbridas y, después, + Conexión híbrida.
En la página Crear conexión híbrida, escriba un nombre para la conexión híbrida y seleccione Crear.
Desarrollo de funciones auxiliares
Crear un script de Python
Este script proporciona funciones auxiliares para aplicaciones que usan conexiones híbridas de Azure Relay. Es probable que estas funciones ayuden con tareas como generar tokens de SAS y establecer conexiones WebSocket para una comunicación segura.
Dependencias
Instale las siguientes bibliotecas de Python mediante pip antes de generar el script de función auxiliar: base64
, hashlib
, hmac
, math
, time
, urllib
Estas bibliotecas se pueden instalar mediante el siguiente comando:
pip install <package name>
Escritura del script de función auxiliar
Este es el aspecto que debe tener el archivo relaylib.py
:
import base64
import hashlib
import hmac
import math
import time
import urllib
# Function which generates the HMAC-SHA256 of a given message
def hmac_sha256(key, msg):
hash_obj = hmac.new(key=key, msg=msg, digestmod=hashlib._hashlib.openssl_sha256)
return hash_obj.digest()
# Function to create a WebSocket URL for listening for a server application
def createListenUrl(serviceNamespace, entityPath, token = None):
url = 'wss://' + serviceNamespace + '/$hc/' + entityPath + '?sb-hc-action=listen&sb-hc-id=123456'
if token is not None:
url = url + '&sb-hc-token=' + urllib.parse.quote(token)
return url
# Function which creates the url for the client application
def createSendUrl(serviceNamespace, entityPath, token = None):
url = 'wss://' + serviceNamespace + '/$hc/' + entityPath + '?sb-hc-action=connect&sb-hc-id=123456'
if token is not None:
url = url + '&sb-hc-token=' + urllib.parse.quote(token)
return url
# Function which creates the Service Bus SAS token.
def createSasToken(serviceNamespace, entityPath, sasKeyName, sasKey):
uri = "http://" + serviceNamespace + "/" + entityPath
encodedResourceUri = urllib.parse.quote(uri, safe = '')
# Define the token validity period in seconds (48 hours in this case)
tokenValidTimeInSeconds = 60 * 60 * 48
unixSeconds = math.floor(time.time())
expiryInSeconds = unixSeconds + tokenValidTimeInSeconds
# Create the plain signature string by combining the encoded URI and the expiry time
plainSignature = encodedResourceUri + "\n" + str(expiryInSeconds)
# Encode the SAS key and the plain signature as bytes
sasKeyBytes = sasKey.encode("utf-8")
plainSignatureBytes = plainSignature.encode("utf-8")
hashBytes = hmac_sha256(sasKeyBytes, plainSignatureBytes)
base64HashValue = base64.b64encode(hashBytes)
# Construct the SAS token string
token = "SharedAccessSignature sr=" + encodedResourceUri + "&sig=" + urllib.parse.quote(base64HashValue) + "&se=" + str(expiryInSeconds) + "&skn=" + sasKeyName
return token
Creación de una aplicación de servidor (agente de escucha)
Para escuchar y recibir mensajes de Relay, escriba un script de servidor WebSocket de Python.
Crear un script de Python
Si deshabilitó la opción que indica que se requiere la autorización del cliente al crear la retransmisión, puede enviar solicitudes a la dirección URL de conexiones híbridas con un explorador. Para acceder a los puntos de conexión protegidos, debe crear y pasar un token de SAS, que se muestra aquí.
Este es un script de Python sencillo que muestra el envío de solicitudes a una dirección URL de conexiones híbridas con tokens de SAS mediante WebSockets.
Dependencias
Instale las siguientes bibliotecas de Python mediante pip antes de ejecutar la aplicación de servidor.
asyncio
,json
,logging
,websockets
Estas bibliotecas se pueden instalar mediante el siguiente comando:
pip install <package name>
Generación de un archivo
config.json
para almacenar los detalles de la conexión{ "namespace": "HYBRID_CONNECTION_NAMESPACE", "path": "HYBRID_CONNECTION_ENTITY_NAME", "keyrule": "SHARED_ACCESS_KEY_NAME", "key": "SHARED_ACCESS_PRIMARY_KEY" }
Reemplace los marcadores de posición entre corchetes por los valores que obtuvo al crear la conexión híbrida.
namespace
: el espacio de nombres de Relay. Asegúrese de utilizar el nombre de espacio de nombres completo; por ejemplo,{namespace}.servicebus.windows.net
.path
: el nombre de la conexión híbrida.keyrule
: nombre de la clave de directivas de acceso compartido, que esRootManageSharedAccessKey
de forma predeterminada.key
: la clave principal del espacio de nombres que guardó anteriormente.
Generación de un archivo de función auxiliar para funciones auxiliares
El siguiente archivo se usa como
relaylib.py
y tiene funciones auxiliares para la generación de direcciones URL de WebSocket y tokens de SAS.Crear un script de Python
Este script proporciona funciones auxiliares para aplicaciones que usan conexiones híbridas de Azure Relay. Es probable que estas funciones ayuden con tareas como generar tokens de SAS y establecer conexiones WebSocket para una comunicación segura.
Dependencias
Instale las siguientes bibliotecas de Python mediante pip antes de generar el script de función auxiliar:
base64
,hashlib
,hmac
,math
,time
,urllib
Estas bibliotecas se pueden instalar mediante el siguiente comando:
pip install <package name>
Escritura del script de función auxiliar
Este es el aspecto que debe tener el archivo
relaylib.py
:import base64 import hashlib import hmac import math import time import urllib # Function which generates the HMAC-SHA256 of a given message def hmac_sha256(key, msg): hash_obj = hmac.new(key=key, msg=msg, digestmod=hashlib._hashlib.openssl_sha256) return hash_obj.digest() # Function to create a WebSocket URL for listening for a server application def createListenUrl(serviceNamespace, entityPath, token = None): url = 'wss://' + serviceNamespace + '/$hc/' + entityPath + '?sb-hc-action=listen&sb-hc-id=123456' if token is not None: url = url + '&sb-hc-token=' + urllib.parse.quote(token) return url # Function which creates the url for the client application def createSendUrl(serviceNamespace, entityPath, token = None): url = 'wss://' + serviceNamespace + '/$hc/' + entityPath + '?sb-hc-action=connect&sb-hc-id=123456' if token is not None: url = url + '&sb-hc-token=' + urllib.parse.quote(token) return url # Function which creates the Service Bus SAS token. def createSasToken(serviceNamespace, entityPath, sasKeyName, sasKey): uri = "http://" + serviceNamespace + "/" + entityPath encodedResourceUri = urllib.parse.quote(uri, safe = '') # Define the token validity period in seconds (48 hours in this case) tokenValidTimeInSeconds = 60 * 60 * 48 unixSeconds = math.floor(time.time()) expiryInSeconds = unixSeconds + tokenValidTimeInSeconds # Create the plain signature string by combining the encoded URI and the expiry time plainSignature = encodedResourceUri + "\n" + str(expiryInSeconds) # Encode the SAS key and the plain signature as bytes sasKeyBytes = sasKey.encode("utf-8") plainSignatureBytes = plainSignature.encode("utf-8") hashBytes = hmac_sha256(sasKeyBytes, plainSignatureBytes) base64HashValue = base64.b64encode(hashBytes) # Construct the SAS token string token = "SharedAccessSignature sr=" + encodedResourceUri + "&sig=" + urllib.parse.quote(base64HashValue) + "&se=" + str(expiryInSeconds) + "&skn=" + sasKeyName return token
Escritura de código para enviar mensajes
Asegúrese de que las dependencias
config.json
yrelaylib.py
estén disponibles en la ruta de accesoEste es el aspecto que debe tener el archivo
listener.py
:import asyncio import json import logging import relaylib import websockets async def run_application(config): serviceNamespace = config["namespace"] entityPath = config["path"] sasKeyName = config["keyrule"] sasKey = config["key"] serviceNamespace += ".servicebus.windows.net" # Configure logging logging.basicConfig(level=logging.INFO) # Enable DEBUG/INFO logging as appropriate try: logging.debug("Generating SAS Token for: %s", serviceNamespace) token = relaylib.createSasToken(serviceNamespace, entityPath, sasKeyName, sasKey) logging.debug("Generating WebSocket URI") wssUri = relaylib.createListenUrl(serviceNamespace, entityPath, token) async with websockets.connect(wssUri) as websocket: logging.info("Listening for messages on Azure Relay WebSocket...") while True: message = await websocket.recv() logging.info("Received message: %s", message) except KeyboardInterrupt: logging.info("Exiting listener.") if __name__ == "__main__": # Load configuration from JSON file with open("config.json") as config_file: config = json.load(config_file) asyncio.run(run_application(config))
Creación de una aplicación de cliente (remitente)
Para enviar mensajes a Relay, puede usar cualquier cliente HTTP o WebSocket. El ejemplo incluido es una implementación de Python.
Crear un script de Python
Si deshabilitó la opción que indica que se requiere la autorización del cliente al crear la retransmisión, puede enviar solicitudes a la dirección URL de conexiones híbridas con un explorador. Para acceder a los puntos de conexión protegidos, debe crear y pasar un token de SAS, que se muestra aquí.
Este es un script de Python sencillo que muestra el envío de solicitudes a una dirección URL de conexiones híbridas con tokens de SAS mediante WebSockets.
Dependencias
Instale las siguientes bibliotecas de Python mediante pip antes de ejecutar la aplicación cliente.
asyncio
,json
,logging
,websockets
Estas bibliotecas se pueden instalar mediante el siguiente comando:
pip install <package name>
Generación de un archivo
config.json
para almacenar los detalles de la conexión{ "namespace": "HYBRID_CONNECTION_NAMESPACE", "path": "HYBRID_CONNECTION_ENTITY_NAME", "keyrule": "SHARED_ACCESS_KEY_NAME", "key": "SHARED_ACCESS_PRIMARY_KEY" }
Reemplace los marcadores de posición entre corchetes por los valores que obtuvo al crear la conexión híbrida.
namespace
: el espacio de nombres de Relay. Asegúrese de utilizar el nombre de espacio de nombres completo; por ejemplo,{namespace}.servicebus.windows.net
.path
: el nombre de la conexión híbrida.keyrule
: nombre de la clave de directivas de acceso compartido, que esRootManageSharedAccessKey
de forma predeterminada.key
: la clave principal del espacio de nombres que guardó anteriormente.
Generación de un archivo de función auxiliar para funciones auxiliares
El siguiente archivo se usa como
relaylib.py
y tiene funciones auxiliares para la generación de direcciones URL de WebSocket y tokens de SAS.Crear un script de Python
Este script proporciona funciones auxiliares para aplicaciones que usan conexiones híbridas de Azure Relay. Es probable que estas funciones ayuden con tareas como generar tokens de SAS y establecer conexiones WebSocket para una comunicación segura.
Dependencias
Instale las siguientes bibliotecas de Python mediante pip antes de generar el script de función auxiliar:
base64
,hashlib
,hmac
,math
,time
,urllib
Estas bibliotecas se pueden instalar mediante el siguiente comando:
pip install <package name>
Escritura del script de función auxiliar
Este es el aspecto que debe tener el archivo
relaylib.py
:import base64 import hashlib import hmac import math import time import urllib # Function which generates the HMAC-SHA256 of a given message def hmac_sha256(key, msg): hash_obj = hmac.new(key=key, msg=msg, digestmod=hashlib._hashlib.openssl_sha256) return hash_obj.digest() # Function to create a WebSocket URL for listening for a server application def createListenUrl(serviceNamespace, entityPath, token = None): url = 'wss://' + serviceNamespace + '/$hc/' + entityPath + '?sb-hc-action=listen&sb-hc-id=123456' if token is not None: url = url + '&sb-hc-token=' + urllib.parse.quote(token) return url # Function which creates the url for the client application def createSendUrl(serviceNamespace, entityPath, token = None): url = 'wss://' + serviceNamespace + '/$hc/' + entityPath + '?sb-hc-action=connect&sb-hc-id=123456' if token is not None: url = url + '&sb-hc-token=' + urllib.parse.quote(token) return url # Function which creates the Service Bus SAS token. def createSasToken(serviceNamespace, entityPath, sasKeyName, sasKey): uri = "http://" + serviceNamespace + "/" + entityPath encodedResourceUri = urllib.parse.quote(uri, safe = '') # Define the token validity period in seconds (48 hours in this case) tokenValidTimeInSeconds = 60 * 60 * 48 unixSeconds = math.floor(time.time()) expiryInSeconds = unixSeconds + tokenValidTimeInSeconds # Create the plain signature string by combining the encoded URI and the expiry time plainSignature = encodedResourceUri + "\n" + str(expiryInSeconds) # Encode the SAS key and the plain signature as bytes sasKeyBytes = sasKey.encode("utf-8") plainSignatureBytes = plainSignature.encode("utf-8") hashBytes = hmac_sha256(sasKeyBytes, plainSignatureBytes) base64HashValue = base64.b64encode(hashBytes) # Construct the SAS token string token = "SharedAccessSignature sr=" + encodedResourceUri + "&sig=" + urllib.parse.quote(base64HashValue) + "&se=" + str(expiryInSeconds) + "&skn=" + sasKeyName return token
Escritura de código para enviar mensajes
Asegúrese de que las dependencias
config.json
yrelaylib.py
estén disponibles en la ruta de accesoEste es el aspecto que debe tener el archivo
sender.py
:import asyncio import json import logging import relaylib import websockets async def run_application(message, config): service_namespace = config["namespace"] entity_path = config["path"] sas_key_name = config["keyrule"] sas_key = config["key"] service_namespace += ".servicebus.windows.net" # Configure logging logging.basicConfig(level=logging.DEBUG) # Enable debug logging token = relaylib.createSasToken(service_namespace, entity_path, sas_key_name, sas_key) logging.debug("Token: %s", token) wss_uri = relaylib.createListenUrl(service_namespace, entity_path, token) logging.debug("WssURI: %s", wss_uri) try: async with websockets.connect(wss_uri) as websocket: logging.info("Sending message to Azure Relay WebSocket...") await websocket.send(json.dumps({"message": message})) logging.info("Message sent: %s", message) except Exception as e: logging.error("An error occurred: %s", str(e)) if __name__ == "__main__": # Load configuration from JSON file with open("config.json") as config_file: config = json.load(config_file) asyncio.run(run_application("This is a message to Azure Relay Hybrid Connections!", config))
Nota:
El código de ejemplo de este artículo usa una cadena de conexión para autenticarse en un espacio de nombres de Azure Relay para simplificar el tutorial. Se recomienda usar la autenticación de Microsoft Entra ID en entornos de producción, en lugar de usar cadenas de conexión o firmas de acceso compartido, lo que puede verse más fácilmente comprometido. Para obtener información detallada y código de ejemplo para usar la autenticación de Microsoft Entra ID, consulte Autenticación y autorización de una aplicación con Microsoft Entra ID para acceder a las entidades de Azure Relay y Autenticación de una identidad administrada con Microsoft Entra ID para acceder a los recursos de Azure Relay.
Ejecución de las aplicaciones
- Ejecute la aplicación de servidor: en un símbolo del sistema escriba
python3 listener.py
. - Ejecute la aplicación cliente: desde un símbolo del sistema, escriba
python3 sender.py
.
Enhorabuena, ha creado una aplicación de conexiones híbridas de extremo a extremo mediante Python.
Pasos siguientes
En esta guía de inicio rápido, ha creado aplicaciones de cliente y servidor de Python que han usado WebSockets para enviar y recibir mensajes. La característica Conexiones híbridas de Azure Relay también admite el uso de HTTP para enviar y recibir mensajes. Para aprender a usar HTTP con Conexiones híbridas de Azure Relay, consulte la guía de inicio rápido de HTTP.
En esta guía de inicio rápido, ha usado Python para crear aplicaciones cliente y servidor. Para aprender a escribir aplicaciones cliente y servidor con .NET Framework, consulte la Guía de inicio rápido de HTTP para .NET o la Guía de inicio rápido de HTTP para .NET.