1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mqtt-rs-rmqtt

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
auth-http.md 16 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 14:56 2a97644

HTTP AUTH

Для аутентификации HTTP используется внешний самописный источник данных аутентификации приложения HTTP, и результат аутентификации определяется на основе данных, возвращаемых API HTTP. Это позволяет реализовать сложную логику аутентификации.

Плагины:

rmqtt-auth-http

Файл конфигурации плагина:

plugins/rmqtt-auth-http.toml

Параметры конфигурации плагина:

##--------------------------------------------------------------------
## rmqtt-auth-http
##--------------------------------------------------------------------

# См. больше ключей и их определения на https://github.com/rmqtt/rmqtt/blob/master/docs/en_US/auth-http.md

http_timeout = "5s"
http_headers.accept = "*/*"
http_headers.Cache-Control = "no-cache"
http_headers.User-Agent = "RMQTT/0.8.0"
http_headers.Connection = "keep-alive"

## Отключиться, если публикация отклонена
##
## Значение: true | false
## По умолчанию: true
disconnect_if_pub_rejected = true

## Отключение по истечении срока действия
##
## Значение: true | false
## По умолчанию: false
disconnect_if_expiry = false

## Возвращать «Запретить», если запрос HTTP вызывает ошибку, иначе «Игнорировать»
##
## Значение: true | false
## По умолчанию: true
deny_if_error = true

##--------------------------------------------------------------------
## Запрос аутентификации.
##
## Переменные:
##  - %u: имя пользователя
##  - %c: идентификатор клиента
##  - %a: IP-адрес
##  - %r: протокол
##  - %P: пароль
##
## Значение: URL
http_auth_req.url = "http://127.0.0.1:9090/mqtt/auth"
## Значение: post | get | put
http_auth_req.method = "post"
## Заголовок HTTP-запроса аутентификации
## Content-Type В настоящее время поддерживаемые значения: application/x-www-form-urlencoded, application/json
http_auth_req.headers = { content-type = "application/x-www-form-urlencoded" }
#http_auth_req.headers.content-type="application/json"
## Значение: Params
http_auth_req.params = { clientid = "%c", username = "%u", password = "%P" }


##--------------------------------------------------------------------
## ACL-запрос.
##
## Переменные:
##  - %A: 1 | 2, 1 = sub, 2 = pub
##  - %u: имя пользователя
##  - %c: идентификатор клиента
##  - %a: IP-адрес
##  - %r: протокол
##  - %t: тема
##
## Значение: URL
http_acl_req.url = "http://127.0.0.1:9090/mqtt/acl"
## Значение: post | get | put
http_acl_req.method = "post"
## Значение: Params
http_acl_req.params = { access = "%A", username = "%u", clientid = "%c", ipaddr = "%a", topic = "%t" }

TIP
Плагин rmqtt-auth-http также включает функцию ACL, которую можно отключить с помощью комментариев.

Принцип аутентификации

RMQTT Broker: в событии подключения устройства используйте текущую информацию о клиенте в качестве параметров для отправки запроса в пользовательскую службу аутентификации для запроса разрешений. Аутентификация запроса обрабатывается на основе возвращённой информации ответа HTTP.

  • Успешная аутентификация:
    • API возвращает код состояния 2xx с телом сообщения: allow.
  • Неудачная аутентификация:
    • API возвращает код статуса 2xx с телом сообщения: deny.
    • Настройка deny_if_error установлена в значение true, и запрос HTTP завершается неудачно.
  • Игнорирование аутентификации:
    • API возвращает код статуса 2xx с телом сообщения: ignore, и цепочка аутентификации продолжается.
    • Ответ API — код состояния 4xx/5xx, тело сообщения игнорируется, что приводит к продолжению цепочки аутентификации с результатом ignore.
    • Запрос HTTP завершается неудачно, настройка deny_if_error имеет значение false, и цепочка аутентификации продолжается с результатом ignore.
  • Суперпользователь:
    • Успешная аутентификация с заголовком ответа «X-Superuser: true». Суперпользователи обходят авторизацию ACL.

Примеры ответов:

HTTP/1.1 200 OK
X-Superuser: true
Content-Type: text/plain
Content-Length: 5
Date: Wed, 07 Jun 2023 01:29:23 GMT

allow

Начиная с версии RMQTT 0.8.0, вы можете установить необязательное поле acl в теле ответа, чтобы указать разрешения клиента. Для получения более подробной информации обратитесь к списку управления доступом (ACL).

Начиная с RMQTT версии 0.8.0, можно установить дополнительное поле expire_at в ответе. Тело ответа для указания времени истечения срока аутентификации клиента и принудительного отключения клиента для повторной аутентификации. Значение должно быть временной меткой Unix (в секундах).

Примеры ответов:

HTTP/1.1 200 OK
Content-Length: 565
Content-Type: application/json; charset=utf-8
Date: Wed, 25 Sep 2024 01:54:37 GMT

{
  "result": "allow",  // "allow" | "deny" | "ignore"
  "superuser": false,  // true | false, Если это поле пустое, значение по умолчанию  `false`
  "expire_at": 1827143027,  // Необязательно, время истечения срока аутентификации
  "acl": [
    {
      "action": "all",
      "permission": "allow",
      "topic": "foo/${clientid}"
    },
    {
      "action": "subscribe",
      "permission": "allow",
      "qos": [1, 2],
      "topic": "eq foo/1/#"
    },
    {
      "action": "publish",
      "permission": "deny",
      "retain": true,
      "topic": "foo/4"
    }
  ]
}

СОВЕТ Для поддержки предопределённых разрешений ACL необходимо установить формат Content-Type в значение 'application/json'.

Запрос аутентификации

При выполнении аутентификации RMQTT будет использовать текущую информацию о клиенте для заполнения и инициирования пользовательского запроса на аутентификацию. Этот запрос используется для получения данных аутентификации клиента с HTTP-сервера.

# etc/plugins/rmqtt-auth-http.toml

## Адрес запроса
http_auth_req.url = "http://127.0.0.1:9090/mqtt/auth"

## Метод HTTP-запроса
## Значение: post | get | put
http_auth_req.method = "post"

## Заголовки HTTP-запросов для запроса аутентификации, заголовок Content-Type настроен по умолчанию.
## Возможные значения заголовка Content-Type: application/x-www-form-urlencoded, application/json
http_auth_req.headers = { content-type = "application/x-www-form-urlencoded" }

## Параметр запроса
http_auth_req.params = { clientid = "%c", username = "%u", password = "%P" }

Когда метод HTTP-запроса — GET, параметры запроса будут переданы в виде строки запроса URL; при запросах POST и PUT они будут отправлены в виде Json или обычной формы (определяется значением content-type).

Вы можете использовать следующие заполнители в запросе аутентификации, и RMQTT Broker автоматически заполнится информацией о клиенте при запросе:

  • %u:Имя пользователя
  • %c:Идентификатор клиента
  • %a:IP-адрес клиента
  • %r:Протокол доступа клиента
  • %P:Открытый текст пароля

СОВЕТ Рекомендуется использовать методы POST и PUT. При использовании метода GET открытый текст пароля может быть записан вместе с URL в журнале сервера во время передачи.

HTTP ACL

Аутентификация HTTP использует внешнее самодельное HTTP-приложение в качестве источника данных аутентификации и авторизации. Оно определяет результат авторизации на основе данных, возвращаемых HTTP API, что позволяет реализовать сложную логику проверки ACL.

Плагин:

rmqtt-auth-http

СОВЕТ Плагин rmqtt-auth-http включает функции аутентификации и может быть отключён путём комментирования определённых разделов кода.

Чтобы включить HTTP ACL, необходимо настроить следующее в etc/plugins/rmqtt-auth-http.toml:

Принцип аутентификации ACL

RMQTT использует текущую связанную с клиентом информацию в качестве параметров в событиях публикации и подписки устройства для отправки запроса в пользовательскую службу аутентификации для разрешения. Запрос авторизации ACL обрабатывается на основе возвращённой информации HTTP-ответа.

  • Успешная авторизация:
    • API возвращает код состояния 2xx с телом сообщения: allow.
  • Нет разрешений:
    • API возвращает код статуса 2xx с телом сообщения: deny.
    • Запрос HTTP API завершается неудачно, а настройка deny_if_error имеет значение true.
  • Игнорировать авторизацию:
    • API возвращает код состояния 2xx с телом сообщения: ignore, и цепочка авторизации продолжается.
    • Ответ API — код состояния 4xx/5xx, тело сообщения игнорируется, в результате чего цепочка авторизации продолжается с результатом ignore.
    • Запрос HTTP API завершается неудачно, настройка deny_if_error установлена в false, в результате цепочка авторизации продолжается с результатом. Кэширование результата авторизации: — заголовок ответа возвращает «X-Cache: -1», что указывает на то, что результат кэшируется. Значение представляет собой длительность тайм-аута кэша в миллисекундах. Значение -1 означает, что он действителен в течение периода активного соединения.

При выполнении аутентификации публикации и подписки RMQTT заполняет текущую информацию о клиенте и инициирует запрос на авторизацию ACL, настроенный пользователем. Этот запрос используется для получения данных авторизации клиента с HTTP-сервера.

Если пользователь является суперпользователем, аутентификация авторизации ACL будет пропущена.

Запрос на авторизацию ACL

# etc/plugins/rmqtt-auth-http.toml

## Адрес запроса
http_acl_req.url = "http://127.0.0.1:9090/mqtt/acl"

## Метод HTTP-запроса
## Значение: post | get | put
http_acl_req.method = "get"

## Заголовки HTTP-запросов для запроса Auth, заголовок Content-Type настроен по умолчанию.
## Возможные значения заголовка Content-Type: application/x-www-form-urlencoded, application/json
#http_acl_req.headers = { content-type = "application/x-www-form-urlencoded" }

## Параметр запроса
http_acl_req.params = { access = "%A", username = "%u", clientid = "%c", ipaddr = "%a", topic = "%t" }

Описание запроса

Когда метод HTTP-запроса — GET, параметры запроса будут переданы в виде строк запроса URL. Для запросов POST и PUT параметры будут отправлены как обычная форма в формате «x-www-form-urlencoded» (content-type: x-www-form-urlencoded).

В запросе аутентификации можно использовать следующие заполнители, и RMQTT автоматически заполнит их информацией о клиенте: %u: имя пользователя; %c: идентификатор клиента; %a: IP-адрес клиента; %r: протокол доступа клиента. Значения: 3=3.1, 4=3.1.1 или 5=5.0; %P: пароль в открытом виде; %p: порт клиента.

  • %A:Типы операций: «1» для подписки, «2» для публикации.
  • %u:Имя пользователя.
  • %c:Идентификатор клиента.
  • %a:IP-адрес клиента.
  • %r:Версия протокола MQTT, к которой обратился клиент. Значения: 3=3.1, 4=3.1.1 или 5=5.0.
  • %t:Тема.

СОВЕТ Рекомендуется использовать методы POST и PUT. При использовании метода GET простой текстовый пароль может быть записан в журналах сервера во время процесса передачи вместе с URL.

Базовая информация HTTP-запроса

Базовая информация и заголовки HTTP API-запроса.

# etc/plugins/rmqtt-auth-http.toml

## Конфигурация заголовка запроса
http_timeout = "5s"
http_headers.accept = "*/*"
http_headers.Cache-Control = "no-cache"
http_headers.User-Agent = "RMQTT/0.8.0"
http_headers.Connection = "keep-alive"

# Если публикация сообщения отклонена, соединение будет разорвано.
disconnect_if_pub_rejected = true

# Если HTTP-запрос сталкивается с ошибкой, вернуть «deny»; в противном случае вернуть «ignore».
deny_if_error = true

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mqtt-rs-rmqtt.git
git@api.gitlife.ru:oschina-mirror/mqtt-rs-rmqtt.git
oschina-mirror
mqtt-rs-rmqtt
mqtt-rs-rmqtt
master