Поделиться через


Начало работы с запросами WebSocket для гибридных подключений ретранслятора в Python

В этом кратком руководстве вы создадите приложения отправителя и получателя Python, которые отправляют и получают сообщения с помощью протокола WebSocket. Приложения используют функцию гибридных подключений службы Azure Relay. См. дополнительные сведения о службе Azure Relay.

При работе с этим кратким руководством вы выполните следующие задачи:

  1. Создайте пространство имен ретранслятора с помощью портала Azure.
  2. Создайте гибридное подключение в этом пространстве имен с помощью портала Azure.
  3. Создание файла свойств config.json для хранения сведений о подключении
  4. Разработка relaylib.py для вспомогательных функций (маркеры SAS, URL-адреса)
  5. Напишите скрипт сервера (прослушивателя) для получения сообщений.
  6. Напишите скрипт клиента (отправителя) для отправки сообщений.
  7. Выполните скрипт сервера (прослушиватель) и при необходимости скрипт клиента (отправителя).

Необходимые компоненты

  • Python. Убедитесь, что вы используете Python 3.10+
  • Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начать работу.

Создание пространства имен с помощью портала Azure

  1. Войдите на портал Azure.

  2. В меню слева выберите Все службы. Выберите "Интеграция", найдите ретрансляторы, переместите указатель мыши на ретрансляторы и нажмите кнопку "Создать".

    Снимок экрана: выбор ретрансляторов —> кнопка

  3. На странице "Создание пространства имен" выполните следующие действия.

    1. Выберите подписку Azure, в которой будет создано пространство имен.

    2. Выберите существующую группу ресурсов, в которую будет размещено это пространство имен, или создайте новую.

    3. Введите имя пространства имен Ретранслятора.

    4. Выберите регион, в котором должно размещаться пространство имен.

    5. В нижней части страницы выберите Review + create (Проверить и создать).

      Снимок экрана: страница

    6. На странице Отзыв и создание выберите Создать.

    7. Через несколько минут вы увидите страницу Ретранслятора для пространства имен.

      Снимок экрана: домашняя страница пространства имен Ретранслятора.

Получение учетных данных управления

  1. На странице "Ретранслятор" выберите политики общего доступа в меню слева.

  2. На странице Политики общего доступа щелкните RootManageSharedAccessKey.

  3. В разделе SAS Policy: RootManageSharedAccessKey (Политика SAS: RootManageSharedAccessKey) нажмите кнопку Копировать рядом с элементом Первичная строка подключения. Строка подключения будет скопирована в буфер обмена для дальнейшего использования. Вставьте на время эти значения в Блокноте или любом другом месте.

  4. Повторите предыдущий шаг, скопировав и вставив значение первичного ключа во временное расположение для последующего использования.

    Снимок экрана: сведения о подключении для пространства имен Ретранслятора.

Создание гибридного подключения с помощью портала Azure

На странице Ретранслятора для пространства имен выполните следующие действия, чтобы создать гибридное подключение.

  1. В меню слева выберите "Гибридные подключения" и выберите "Гибридные подключения".

    Снимок экрана: страница гибридных подключений.

  2. На странице "Создание гибридного подключения" введите имя гибридного подключения и нажмите кнопку "Создать".

    Снимок экрана: страница

Разработка вспомогательных функций

Создание скрипта Python

Этот скрипт предоставляет вспомогательные функции для приложений, использующих гибридные подключения Azure Relay. Эти функции, скорее всего, помогают с задачами, такими как создание маркеров SAS и установка подключений WebSocket для безопасного взаимодействия.

Зависимости

Установите следующие библиотеки Python с помощью pip перед созданием вспомогательного скрипта функции: base64, , hashlib, hmacmathtimeurllib

Эти библиотеки можно установить с помощью следующей команды:

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.

Зависимости

  1. Установите следующие библиотеки Python с помощью pip перед запуском серверного приложения

    asyncio, , jsonloggingwebsockets

    Эти библиотеки можно установить с помощью следующей команды:

     pip install <package name>
    
  2. Создание файла для хранения сведений 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 — первичный ключ пространства имен, сохраненного ранее.
  3. Создание вспомогательного файла функции для вспомогательных функций

    Следующий файл используется как relaylib.py и имеет вспомогательные функции для создания URL-адресов WebSocket и маркеров SAS

    Создание скрипта Python

    Этот скрипт предоставляет вспомогательные функции для приложений, использующих гибридные подключения Azure Relay. Эти функции, скорее всего, помогают с задачами, такими как создание маркеров SAS и установка подключений WebSocket для безопасного взаимодействия.

    Зависимости

    Установите следующие библиотеки Python с помощью pip перед созданием вспомогательного скрипта функции: base64, , hashlib, hmacmathtimeurllib

    Эти библиотеки можно установить с помощью следующей команды:

    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
    

Написание кода для отправки сообщений

  1. Убедитесь, что зависимость config.json и relaylib.py доступны в пути

  2. Вот как должен выглядеть файл 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.

Зависимости

  1. Установите следующие библиотеки Python с помощью pip перед запуском клиентского приложения

    asyncio, , jsonloggingwebsockets

    Эти библиотеки можно установить с помощью следующей команды:

     pip install <package name>
    
  2. Создание файла для хранения сведений 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 — первичный ключ пространства имен, сохраненного ранее.
  3. Создание вспомогательного файла функции для вспомогательных функций

    Следующий файл используется как relaylib.py и имеет вспомогательные функции для создания URL-адресов WebSocket и маркеров SAS

    Создание скрипта Python

    Этот скрипт предоставляет вспомогательные функции для приложений, использующих гибридные подключения Azure Relay. Эти функции, скорее всего, помогают с задачами, такими как создание маркеров SAS и установка подключений WebSocket для безопасного взаимодействия.

    Зависимости

    Установите следующие библиотеки Python с помощью pip перед созданием вспомогательного скрипта функции: base64, , hashlib, hmacmathtimeurllib

    Эти библиотеки можно установить с помощью следующей команды:

    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
    

Написание кода для отправки сообщений

  1. Убедитесь, что зависимость config.json и relaylib.py доступны в пути

  2. Вот как должен выглядеть файл 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.

Запуск приложений

  1. Запустите серверное приложение: из типа python3 listener.pyкомандной строки.
  2. Запустите клиентское приложение: из типа python3 sender.pyкомандной строки.

Поздравляем, вы создали комплексное приложение гибридных подключений с помощью Python!

Следующие шаги

В этом кратком руководстве вы создали клиентские и серверные приложения Python, которые использовали WebSockets для отправки и получения сообщений. Функция гибридных подключений службы Azure Relay также поддерживает использование протокола HTTP для отправки и получения сообщений. См. дополнительные сведения об использовании протокола HTTP с гибридными подключениями Azure Relay.

В этом кратком руководстве вы использовали Python для создания клиентских и серверных приложений. Сведения о создании клиентских и серверных приложений с помощью платформа .NET Framework см. в кратком руководстве по .NET HTTP или кратком руководстве по .NET HTTP.