Подключение AMQP-систем к «1С:Шине»

Чтобы отправлять и получать сообщения, внешние системы должны подключиться к серверу «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Строка(ПолучитьДвоичныеДанныеИзСтроки(СтрШаблон("%1:%2", 
                                                           ИдентификаторКлиента, 
                                                           СекретКлиента)));
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");

Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Заголовки.Вставить("Authorization", СтрШаблон("Basic %1", СтрокаBase64));

Запрос = Новый HTTPЗапрос("/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 сервисов «1С:Шины»:

  • При подключении к брокеру сервера билет указывается в качестве имени и пароля при подключении.
  • При вызове HTTP и SOAP сервисов билет указывается в заголовке Authorization в форме:
    Authorization: Bearer БИЛЕТ

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

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