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

Получение мастер-токена из 1С

Гайд показывает, как сформировать JWT в 1С, подписать его приватным ключом RSA и получить мастер-токенMaster-Api-Token Мастер-токен для M2M-интеграций. Позволяет выполнять запросы от имени любого пользователя системы через заголовки Impersonated-User-Id. Получается через ESA с помощью сертификата интегратора. через метод Создать мастер-токен.

Что получится в конце

1С сформирует Bearer-токен JWT, подпишет его приватным ключом RSA, вызовет ESAESA Сервис аутентификации внешних систем (esa.hr-link.ru). Через ESA интеграторы получают мастер-токены и реализуют сквозную аутентификацию. и получит masterToken для запросов к API HRlink.

Что нужно заранее

Используйте этот пример после регистрации интегратора. До запуска кода подготовьте:

ЗначениеГде взять
tenantHostДомен тенантаTenant Экземпляр системы HRlink на отдельном домене (например, company.hr-link.ru). Внутри одного тенанта может быть несколько пространств клиентов., например company.hr-link.ru
issЗначение издателя, которое зарегистрировала Служба заботы
subUUID интегратора из ответа Службы заботы
Приватный ключФайл integrator_private.key, который соответствует сертификату, переданному в Службу заботы

Какие методы используются

ШагМетод
Получить мастер-токенMaster-Api-Token Мастер-токен для M2M-интеграций. Позволяет выполнять запросы от имени любого пользователя системы через заголовки Impersonated-User-Id. Получается через ESA с помощью сертификата интегратора.Создать мастер-токен
Выполнить запрос от имени пользователяЛюбой метод HRlink с заголовками мастер-токенаMaster-Api-Token Мастер-токен для M2M-интеграций. Позволяет выполнять запросы от имени любого пользователя системы через заголовки Impersonated-User-Id. Получается через ESA с помощью сертификата интегратора., например Получить текущего пользователя
Версия платформы

Используйте 1С:Предприятие 8.3.24+. В версиях 8.3.21–8.3.23 есть ошибка: поля iat и exp могут попасть в JWT строками, а HRlink ожидает числа.

Алгоритм подписи

Статья 1С про ТокенДоступа показывает общий механизм JWT и пример с HS256. HRlink не принимает HS256: подписывайте токен алгоритмом RS256, RS384 или RS512; рекомендуемый вариант — RS256.

Пример кода

В примере 1С формирует JWT с алгоритмом RS256, передаёт его как Bearer-токен и получает masterToken от esa.hr-link.ru.

Функция ПолучитьМастерТокен() Экспорт

Сервер = "esa.hr-link.ru";
АдресРесурса = "/api/v1/masterTokens";

ТелоЗапроса = "{""tenantHost"": ""company.hr-link.ru""}";

Возврат ВыполнитьМетодPOST(Сервер, АдресРесурса, ТелоЗапроса);

КонецФункции

Функция ВыполнитьМетодPOST(Сервер, АдресРесурса, ТелоЗапроса)

Соединение = Новый HTTPСоединение(Сервер,,,,,30, Новый ЗащищенноеСоединениеOpenSSL());

Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
Заголовки.Вставить("Accept", "application/json");

Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса);
Запрос.ДобавитьТокенДоступа(СформироватьBearerТокен());

Результат = Новый Соответствие;
Результат.Вставить("result", Ложь);

Попытка
Ответ = Соединение.POST(Запрос);
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();

Если ЗначениеЗаполнено(ТелоОтвета) Тогда
Результат = ОбщегоНазначения.JSONЗначение(ТелоОтвета);
КонецЕсли;

Если Ответ.КодСостояния = 200 Тогда
// Результат содержит masterToken.
ИначеЕсли Ответ.КодСостояния >= 400 Тогда
// Разберите код ошибки из тела ответа.
Иначе
// Зафиксируйте неожиданный код ответа сервиса.
КонецЕсли;

Исключение
// Зафиксируйте ошибку подключения или разбора ответа.
КонецПопытки;

Возврат Результат;

КонецФункции

Функция СформироватьBearerТокен()

АлгоритмПодписи = АлгоритмПодписиТокенаДоступа.RS256;
ТекущееВремя = ТекущаяДата();

ТокенДоступа = Новый ТокенДоступа;
ТокенДоступа.Заголовки.Вставить("alg", Строка(АлгоритмПодписи));
ТокенДоступа.Получатели = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("esa.hr-link.ru");
ТокенДоступа.Эмитент = "RogaKopyta";
ТокенДоступа.КлючСопоставленияПользователя = ИдентификаторИнтегратораHRlink();
ТокенДоступа.ВремяСоздания = ДатаВUnixTimestamp(ТекущееВремя);
ТокенДоступа.ВремяЖизни = 600;
ТокенДоступа.Идентификатор = Новый УникальныйИдентификатор;

ТокенДоступа.Подписать(АлгоритмПодписи, КлючПодписи());

Возврат ТокенДоступа;

КонецФункции

Функция ИдентификаторИнтегратораHRlink()

Возврат "1aaa11a1-111a-1a1a-a11a-11a1a11a1a1a";

КонецФункции

Функция ДатаВUnixTimestamp(Дата)

Возврат УниверсальноеВремя(Дата) - '19700101';

КонецФункции

Функция КлючПодписи()

Возврат Константы.КлючПодписи.Получить();

КонецФункции

Замените в примере:

Значение в кодеНа что заменить
company.hr-link.ruДомен вашего тенантаTenant Экземпляр системы HRlink на отдельном домене (например, company.hr-link.ru). Внутри одного тенанта может быть несколько пространств клиентов.
RogaKopytaЗарегистрированное значение iss
1aaa11a1-111a-1a1a-a11a-11a1a11a1a1aUUID интегратора (sub)
Константы.КлючПодписи.Получить()Ваш способ получения приватного ключа

Требования к приватному ключу

Передавайте в КлючПодписи() приватный ключ в формате PEM:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

Если ключ хранится в формате ENCRYPTED PRIVATE KEY, сначала конвертируйте его в PRIVATE KEY. HRlink проверяет JWT по сертификату, который вы передали в Службу заботы, поэтому ключ должен соответствовать этому сертификату.

Не передавайте приватный ключ

Приватный ключ подписывает JWT от имени интегратора. Не отправляйте его в HRlink, не храните в репозитории и не показывайте в логах. В Службу заботы передавайте только сертификат.

Ответ HRlink

При успешном запросе метод Создать мастер-токен вернёт masterToken:

{
"result": true,
"masterToken": "eyJhbGc..."
}

После получения masterToken передавайте его в заголовке Master-Api-Token при запросах к API HRlink. Чтобы выполнить запрос от имени пользователя, добавьте заголовки Impersonated-User-Id и Impersonated-User-Id-Type; подробнее — в разделе Запросы от имени пользователя.

Частые ошибки

ОшибкаЧто проверить
51.214JWT подписан не RSA-алгоритмом. Используйте RS256, RS384 или RS512; рекомендуемый вариант — RS256
51.205Истёк Bearer-токен. Сформируйте новый JWT
51.210Bearer-токен превысил максимальный срок жизни. В примере срок жизни JWT — 600 секунд
Ошибка проверки подписиВ Службу заботы передали сертификат, который не соответствует приватному ключу, или код подписывает JWT другим приватным ключом
Ошибка разбора JWTПроверьте версию 1С и убедитесь, что iat и exp попадают в JWT числами