Перейти к основному содержимому

Подключение AMQP-систем

Чтобы отправлять и получать сообщения, внешние системы должны подключиться к серверу «1С:Шины» по протоколу AMQP версии 1.0. Для этого предназначены узлы процесса интеграции вида Канал1СИсточник и Канал1СНазначение. Порт брокера сервера «1С:Шины» и имя очереди для подключения вы можете узнать при помощи HTTP-сервиса описания «1С:Шины».

дополнительно

При отправке сообщения может быть определен перечень информационных систем, которым это сообщение адресовано. Для этого следует задать в значении заголовка AMQP-сообщения с именем RecipientCode строку, содержащую коды справочника информационных систем, разделенные запятой ,. Если информационные системы явно не указаны, сообщение будет направлено всем возможным информационным системам.

Аутентификация

При подключении к серверу клиентское приложение должно пройти процедуру аутентификации.

Отправьте запрос на получение билета (token) аутентификации на сервер по адресу:

http://serverhost:port/auth/oidc/token

где serverhost:port имя хоста и порт, определенные в конфигурационном файле server.yaml.

Формат запроса:

POST /auth/oidc/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <ClientId:ClientSecret в кодировке Base64>
grant_type=CLIENT_CREDENTIALS

В качестве ClientId и ClientSecret следует указать идентификатор и секрет клиента, полученные при создании информационных систем в приложении «1С:Шина» (ПриложениеИнфосистемыВыдать ключ API).

Пример:

пер ИдентификаторКлиента = "1_e1NvnB33xjB7IrZCqJT2WHOyR0Ew58vedLLQxXwE="
пер СекретКлиента = "zd9QHBC_D9Jmurubko7xB97eJqCAQjJk5lNYp7Ny4s4="
пер СтрокаBase64 = Кодировки.Base64.КодироватьВСтроку(ИдентификаторКлиента + ":" + СекретКлиента)

СтрокаBase64 = СтрокаBase64.Заменить(Символы.НОВАЯ_СТРОКА, "", Ложь)
СтрокаBase64 = СтрокаBase64.Заменить(Символы.ВОЗВРАТ_КАРЕТКИ, "", Ложь)

пер Заголовки = новый ЗаголовкиHttp()
Заголовки.Добавить("Content-Type", "application/x-www-form-urlencoded")
Заголовки.Добавить("Authorization", "Basic $СтрокаBase64")

пер Запрос = КлиентHttp.ЗапросGet("/auth/oidc/token")
Запрос.ДобавитьЗаголовки(Заголовки)
Запрос.УстановитьТело("grant_type=client_credentials")

Пример cURL:

curl --request POST \
--url http://localhost:9090/auth/oidc/token \
-u 1_e1NvnB33xjB7IrZCqJT2WHOyR0Ew58vedLLQxXwE=:zd9QHBC_D9Jmurubko7xB97eJqCAQjJk5lNYp7Ny4s4= \
--header "content-type: application/x-www-form-urlencoded" \
--data grant_type=client_credentials

Пример Python:

import requests
import base64

url = 'http://localhost:9090/auth/oidc/token'
id = '1_e1NvnB33xjB7IrZCqJT2WHOyR0Ew58vedLLQxXwE='
secret = 'zd9QHBC_D9Jmurubko7xB97eJqCAQjJk5lNYp7Ny4s4='
qry = '{id}:{secret}'.format(id=id, secret=secret)
basicAuthKey = base64.b64encode(str.encode(qry)).decode('ascii')
headers = {
'Authorization': 'Basic {}'.format(basicAuthKey),
'Content-Type': 'application/x-www-form-urlencoded'
}
resp = requests.post(url, headers=headers, data='grant_type=client_credentials')
if (not resp.ok):
print('Auth error: ' + resp.reason)
exit(1)
authToken = resp.json()['id_token']

В случае успешного получения билета, вы получите ответ в формате JSON:

{
"access_token" : "Not implemented",
"id_token" : "БИЛЕТ",
"token_type" : "Bearer"
}

Полученный билет должен использоваться при подключении к брокеру сервера «1С:Шины» по протоколу AMQP, а также при вызове HTTP и SOAP-сервисов «Шины»:

  • При подключении к брокеру сервера билет указывается в качестве имени и пароля при подключении.

  • При вызове HTTP и SOAP-сервисов билет указывается в заголовке Authorization в форме:

    Authorization: Bearer БИЛЕТ

Билет действителен в течение часа, поэтому если нужно сделать сразу несколько вызовов (возможно, разных сервисов), то можно использовать уже полученный билет, не вызывая снова менеджер аутентификации.

Если билет устарел, то при вызове сервиса вернется ответ с кодом 401. Это значит, что нужно снова запросить билет у менеджера аутентификации. При попытке подключиться к брокеру сервера с устаревшим билетом будет получена ошибка аутентификации.