Начало работы с запросами WebSocket для гибридных подключений ретранслятора в Python
В этом кратком руководстве вы создадите приложения отправителя и получателя Python, которые отправляют и получают сообщения с помощью протокола WebSocket. Приложения используют функцию гибридных подключений службы Azure Relay. См. дополнительные сведения о службе Azure Relay.
При работе с этим кратким руководством вы выполните следующие задачи:
- Создайте пространство имен ретранслятора с помощью портала Azure.
- Создайте гибридное подключение в этом пространстве имен с помощью портала Azure.
- Создание файла свойств config.json для хранения сведений о подключении
- Разработка relaylib.py для вспомогательных функций (маркеры SAS, URL-адреса)
- Напишите скрипт сервера (прослушивателя) для получения сообщений.
- Напишите скрипт клиента (отправителя) для отправки сообщений.
- Выполните скрипт сервера (прослушиватель) и при необходимости скрипт клиента (отправителя).
Необходимые компоненты
- Python. Убедитесь, что вы используете Python 3.10+
- Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начать работу.
Создание пространства имен с помощью портала Azure
Войдите на портал Azure.
В меню слева выберите Все службы. Выберите "Интеграция", найдите ретрансляторы, переместите указатель мыши на ретрансляторы и нажмите кнопку "Создать".
На странице "Создание пространства имен" выполните следующие действия.
Выберите подписку Azure, в которой будет создано пространство имен.
Выберите существующую группу ресурсов, в которую будет размещено это пространство имен, или создайте новую.
Введите имя пространства имен Ретранслятора.
Выберите регион, в котором должно размещаться пространство имен.
В нижней части страницы выберите Review + create (Проверить и создать).
На странице Отзыв и создание выберите Создать.
Через несколько минут вы увидите страницу Ретранслятора для пространства имен.
Получение учетных данных управления
На странице "Ретранслятор" выберите политики общего доступа в меню слева.
На странице Политики общего доступа щелкните RootManageSharedAccessKey.
В разделе SAS Policy: RootManageSharedAccessKey (Политика SAS: RootManageSharedAccessKey) нажмите кнопку Копировать рядом с элементом Первичная строка подключения. Строка подключения будет скопирована в буфер обмена для дальнейшего использования. Вставьте на время эти значения в Блокноте или любом другом месте.
Повторите предыдущий шаг, скопировав и вставив значение первичного ключа во временное расположение для последующего использования.
Создание гибридного подключения с помощью портала Azure
На странице Ретранслятора для пространства имен выполните следующие действия, чтобы создать гибридное подключение.
В меню слева выберите "Гибридные подключения" и выберите "Гибридные подключения".
На странице "Создание гибридного подключения" введите имя гибридного подключения и нажмите кнопку "Создать".
Разработка вспомогательных функций
Создание скрипта Python
Этот скрипт предоставляет вспомогательные функции для приложений, использующих гибридные подключения Azure Relay. Эти функции, скорее всего, помогают с задачами, такими как создание маркеров SAS и установка подключений WebSocket для безопасного взаимодействия.
Зависимости
Установите следующие библиотеки Python с помощью pip перед созданием вспомогательного скрипта функции: base64
, , hashlib
, hmac
math
time
urllib
Эти библиотеки можно установить с помощью следующей команды:
pip install <package name>
Написание вспомогательного скрипта функции
Вот как должен выглядеть файл 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
Создание серверного приложения (прослушивателя)
Чтобы прослушивать и получать сообщения из Ретранслятора, напишите скрипт сервера Python WebSocket.
Создание скрипта Python
Если при создании ретранслятора отключен параметр "Требуется авторизация клиента", вы можете отправлять запросы по URL-адресу гибридных подключений с помощью любого браузера. Для доступа к защищенным конечным точкам необходимо создать и передать маркер SAS, который показан здесь.
Ниже приведен простой скрипт Python, демонстрирующий отправку запросов в URL-адрес гибридных подключений с маркерами SAS, использующими WebSockets.
Зависимости
Установите следующие библиотеки Python с помощью pip перед запуском серверного приложения
asyncio
, ,json
logging
websockets
Эти библиотеки можно установить с помощью следующей команды:
pip install <package name>
Создание файла для хранения сведений
config.json
о подключении{ "namespace": "HYBRID_CONNECTION_NAMESPACE", "path": "HYBRID_CONNECTION_ENTITY_NAME", "keyrule": "SHARED_ACCESS_KEY_NAME", "key": "SHARED_ACCESS_PRIMARY_KEY" }
Замените заполнители в скобках значениями, которые получены при создании гибридного подключения.
namespace
— пространство имен ретранслятора. Необходимо использовать полное имя пространства имен, например{namespace}.servicebus.windows.net
.path
— имя гибридного подключения.keyrule
— Имя ключа политики общего доступа, который по умолчанию.RootManageSharedAccessKey
key
— первичный ключ пространства имен, сохраненного ранее.
Создание вспомогательного файла функции для вспомогательных функций
Следующий файл используется как
relaylib.py
и имеет вспомогательные функции для создания URL-адресов WebSocket и маркеров SASСоздание скрипта Python
Этот скрипт предоставляет вспомогательные функции для приложений, использующих гибридные подключения Azure Relay. Эти функции, скорее всего, помогают с задачами, такими как создание маркеров SAS и установка подключений WebSocket для безопасного взаимодействия.
Зависимости
Установите следующие библиотеки Python с помощью pip перед созданием вспомогательного скрипта функции:
base64
, ,hashlib
,hmac
math
time
urllib
Эти библиотеки можно установить с помощью следующей команды:
pip install <package name>
Написание вспомогательного скрипта функции
Вот как должен выглядеть файл
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
Написание кода для отправки сообщений
Убедитесь, что зависимость
config.json
иrelaylib.py
доступны в путиВот как должен выглядеть файл
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))
Создание клиентского приложения (отправителя)
Для отправки сообщений в Ретранслятор можно использовать любой клиент HTTP или WebSocket, пример включает реализацию Python.
Создание скрипта Python
Если при создании ретранслятора отключен параметр "Требуется авторизация клиента", вы можете отправлять запросы по URL-адресу гибридных подключений с помощью любого браузера. Для доступа к защищенным конечным точкам необходимо создать и передать маркер SAS, который показан здесь.
Ниже приведен простой скрипт Python, демонстрирующий отправку запросов в URL-адрес гибридных подключений с маркерами SAS, использующими WebSockets.
Зависимости
Установите следующие библиотеки Python с помощью pip перед запуском клиентского приложения
asyncio
, ,json
logging
websockets
Эти библиотеки можно установить с помощью следующей команды:
pip install <package name>
Создание файла для хранения сведений
config.json
о подключении{ "namespace": "HYBRID_CONNECTION_NAMESPACE", "path": "HYBRID_CONNECTION_ENTITY_NAME", "keyrule": "SHARED_ACCESS_KEY_NAME", "key": "SHARED_ACCESS_PRIMARY_KEY" }
Замените заполнители в скобках значениями, которые получены при создании гибридного подключения.
namespace
— пространство имен ретранслятора. Необходимо использовать полное имя пространства имен, например{namespace}.servicebus.windows.net
.path
— имя гибридного подключения.keyrule
— Имя ключа политики общего доступа, который по умолчанию.RootManageSharedAccessKey
key
— первичный ключ пространства имен, сохраненного ранее.
Создание вспомогательного файла функции для вспомогательных функций
Следующий файл используется как
relaylib.py
и имеет вспомогательные функции для создания URL-адресов WebSocket и маркеров SASСоздание скрипта Python
Этот скрипт предоставляет вспомогательные функции для приложений, использующих гибридные подключения Azure Relay. Эти функции, скорее всего, помогают с задачами, такими как создание маркеров SAS и установка подключений WebSocket для безопасного взаимодействия.
Зависимости
Установите следующие библиотеки Python с помощью pip перед созданием вспомогательного скрипта функции:
base64
, ,hashlib
,hmac
math
time
urllib
Эти библиотеки можно установить с помощью следующей команды:
pip install <package name>
Написание вспомогательного скрипта функции
Вот как должен выглядеть файл
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
Написание кода для отправки сообщений
Убедитесь, что зависимость
config.json
иrelaylib.py
доступны в путиВот как должен выглядеть файл
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))
Примечание.
Пример кода в этой статье использует строка подключения для проверки подлинности в пространстве имен Ретранслятора Azure, чтобы упростить учебник. Мы рекомендуем использовать проверку подлинности Идентификатора Microsoft Entra в рабочих средах, а не использовать строка подключения или подписанные URL-адреса, что может быть проще скомпрометировано. Подробные сведения и пример кода для использования проверки подлинности идентификатора Microsoft Entra см. в статье "Проверка подлинности и авторизация приложения с помощью идентификатора Microsoft Entra ID" для доступа к сущностям Ретрансляции Azure и аутентификации управляемого удостоверения с помощью идентификатора Microsoft Entra для доступа к ресурсам Ретранслятора Azure.
Запуск приложений
- Запустите серверное приложение: из типа
python3 listener.py
командной строки. - Запустите клиентское приложение: из типа
python3 sender.py
командной строки.
Поздравляем, вы создали комплексное приложение гибридных подключений с помощью Python!
Следующие шаги
В этом кратком руководстве вы создали клиентские и серверные приложения Python, которые использовали WebSockets для отправки и получения сообщений. Функция гибридных подключений службы Azure Relay также поддерживает использование протокола HTTP для отправки и получения сообщений. См. дополнительные сведения об использовании протокола HTTP с гибридными подключениями Azure Relay.
В этом кратком руководстве вы использовали Python для создания клиентских и серверных приложений. Сведения о создании клиентских и серверных приложений с помощью платформа .NET Framework см. в кратком руководстве по .NET HTTP или кратком руководстве по .NET HTTP.