Top.Mail.Ru
Заказать консультацию
специалиста 1С
Отправить заявку

ИнфоСофт использует файлы «cookie» с целью персонализации сервисов и повышения удобства пользования веб-сайтом. Вы можете запретить обработку сookies в настройках браузера. Пожалуйста, ознакомьтесь с политикой использования cookies.
Оставаясь на сайте, вы соглашаетесь с политикой использования cookies.

JWT-авторизация

Лацигин Максим Посмотреть все статьи >> Старший разработчик 1С франчайзинговой сети "ИнфоСофт".
22.07.2025
1775
Время прочтения - 10 мин.
Заказать консультацию

При разработке различной функциональности в 1С зачастую требуется работать с внешними ресурсами, такими как API и Web-сервисы. Для авторизации пользователей таких ресурсов в 1С используется авторизация по логину и паролю – basic auth. Такой способ авторизации является наиболее простым, но в то же время менее безопасным и гибким. Это связно с тем, что при авторизации при помощи basic auth пароль передается в открытом виде в base64-строке, которая легко декодируется. Начиная с версии платформы 8.3.21 в 1С появилась возможность авторизации по JSON Web Token (JWT). Этот вид авторизации не требует хранения пароля на клиенте. В данной статье будет рассмотрено, что такое JWT, его преимущества по сравнению с basic authorization и пример использования JWT для авторизации внешнего пользователя в базе.

Для начала разберемся, что же такое JSON Web Token. JWT – стандарт генерации токенов доступа. Данные в JWT представляются в виде JSON, который затем кодируется в Base64Url. Все такие токены представлены в виде структуры из трех основных полей:

•   Заголовок (header) — поле, в котором передается алгоритм шифрования данных, а также тип самого токена.

•   Полезная нагрузка (payload) – поле, в котором передаются основные сведения о пользователе. Такими сведениями могут быть имя пользователя, его роли, личные данные и любая другая информация.

•   Цифровая подпись (signature) – поле, содержащее строку, cформированную с использованием данных из полей header, payload и секретного ключа. Это поле отвечает за подтверждение целостности данных токена.

Сравним JWT авторизацию с авторизацией по логину и паролю.

Критерий сравнения

JWT

Логин и пароль (basic auth)

Безопасность

Данные подписаны цифровой подписью

Данные передаются в формате Base64, без шифрования

Гибкость данных

Стандартизированная передача произвольных данных в поле payload

Только логин и пароль, дополнительные данные предаются отдельно, например, в заголовке запроса

Срок действия доступа

Указан в данных токена

Зависит от сессии и смены пароля

Отзыв доступа

Для отзыва существует черный список токенов (blacklist), а также короткий срок жизни вместе с refresh токенами

Смена пароля и завершение сессии

Теперь перейдем к практике и посмотрим, как создается и применяется токен в базах 1С.

Чтобы сгенерировать токен и использовать его при авторизации, необходимо выполнить следующие шаги:

1) создать http-сервис, а также константу для хранения секретного ключа;

2) опубликовать созданный сервис;

3) написать код, генерирующий токен;

4) сделать необходимые настройки базы и публикации для возможности использовать генерируемый токен;

5) проверить работу токена.

Начнем с создания объектов. Поскольку авторизация будет происходить через http-сервис, нужно его создать и описать необходимые URL.

1.png

Создадим точки для теста авторизации и для получения токена.

2.png

3.png

Также создадим константу, в которой будет храниться секретный ключ для подписи генерируемых токенов. Секретный ключ – произвольная строка с большим количеством символов.

4.png

После чего опубликуем созданный http-сервис. 

5.png

Для создания токена опишем простую функцию.

Функция СгенерироватьИПолучитьТокенGET(Запрос)

     Ответ = Новый HTTPСервисОтвет(200);

     Попытка

          ТекПользователь = Пользователи.ТекущийПользователь();      

          Токен = Новый ТокенДоступа;

          // База, которой был выдан токен

          Токен.Эмитент = "testDB";

          // Имена http-сервисов, для которых будет доступен токен

          Токен.Получатели.Добавить("jwtAuth");

          // Значение, по которому будет производиться пользователя для авторизации

          Токен.КлючСопоставленияПользователя = ТекПользователь.Наименование;

          // Unix-время создания токена

          Токен.ВремяСоздания = ТекущаяУниверсальнаяДата() - Дата(1970,1,1,0,0,0);

          // Время действия токена с момента создания в секундах

          Токен.ВремяЖизни = "1800";

          // В полезную нагрузку можем передавать произвольные данные

          Токен.ПолезнаяНагрузка.Вставить("universalDate", ТекущаяУниверсальнаяДата());

          Токен.ПолезнаяНагрузка.Вставить("userGUID", Строка(ТекПользователь.УникальныйИдентификатор()));       

          // Подпись токена с использованием секретного ключа

          // Для примера использован ключ "123123123"

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

          ДанныеДляОтвета = Новый Структура;

          ДанныеДляОтвета.Вставить("success", Истина);

          ДанныеДляОтвета.Вставить("token", Строка(Токен));

          ПараметрыJSON = Новый ПараметрыЗаписиJSON(, " ");

          ЗаписьJSON = Новый ЗаписьJSON;

          ЗаписьJSON.ПроверятьСтруктуру = Истина;

          ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);

          ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтвета);

          СтрокаJSON = ЗаписьJSON.Закрыть();

          Ответ.УстановитьТелоИзСтроки(СтрокаJSON);

     Исключение    

          // Обработка ошибки при генерации

          Ответ = Новый HTTPСервисОтвет(400);

          ДанныеДляОтвета = Новый Структура;

          ДанныеДляОтвета.Вставить("success", Ложь);

          ДанныеДляОтвета.Вставить("Info", ОписаниеОшибки());

          ПараметрыJSON = Новый ПараметрыЗаписиJSON(, " ");

          ЗаписьJSON = Новый ЗаписьJSON;

          ЗаписьJSON.ПроверятьСтруктуру = Истина;

          ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);

          ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтвета);

          СтрокаJSON = ЗаписьJSON.Закрыть();

          Ответ.УстановитьТелоИзСтроки(СтрокаJSON);

     КонецПопытки;

     Возврат Ответ;

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

 

Вместе с ней опишем функцию для тестирования авторизации.

Функция ТестАвторизацииGET(Запрос)

     Ответ = Новый HTTPСервисОтвет(200);

     Попытка

          ТекПользователь = Пользователи.ТекущийПользователь();

          ТекстСообщения = СтрШаблон("Авторизация под пользователем %1 успешна",

                                 ТекПользователь.Наименование);

          ДанныеДляОтвета = Новый Структура;

          ДанныеДляОтвета.Вставить("success", Истина);

          ДанныеДляОтвета.Вставить("Info ", ТекстСообщения);

          ПараметрыJSON = Новый ПараметрыЗаписиJSON(, " ");

          ЗаписьJSON = Новый ЗаписьJSON;

          ЗаписьJSON.ПроверятьСтруктуру = Истина;

          ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);         

          ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтвета);

          СтрокаJSON = ЗаписьJSON.Закрыть();         

          Ответ.УстановитьТелоИзСтроки(СтрокаJSON);         

     Исключение             

          // Обработка ошибки

          Ответ = Новый HTTPСервисОтвет(400);

          ДанныеДляОтвета = Новый Структура;

          ДанныеДляОтвета.Вставить("success", Ложь);

          ДанныеДляОтвета.Вставить("Info", ОписаниеОшибки());         

          ПараметрыJSON = Новый ПараметрыЗаписиJSON(, " ");

          ЗаписьJSON = Новый ЗаписьJSON;

          ЗаписьJSON.ПроверятьСтруктуру = Истина;

          ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);         

          ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтвета);

          СтрокаJSON = ЗаписьJSON.Закрыть(); 

          Ответ.УстановитьТелоИзСтроки(СтрокаJSON);         

     КонецПопытки;    

     Возврат Ответ;    

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


Следующий шаг – это настройка пользователя и публикации для возможности авторизации при помощи JWT. Сначала настроим пользователя. В данном примере авторизацию будем настраивать для пользователя «Администратор». Для этого перейдем в раздел Администрирование/Пользователи. Для пользователя, который будет использовать авторизацию при помощи токена, требуется включить настройку «Аутентификация токеном доступа».

6.png

 

После настройки пользователя переходим к настройке публикации. В папке публикации открываем файл default.vrd и в нем ищем созданный нами http-сервис. Внутри описания сервиса необходимо добавить недостающие теги. Часть тегов может быть создана платформой, но остальное необходимо дописать вручную. Данные указанные в настройках публикации должны совпадать с теми, которые были использованы при генерации токена доступа. Пример настройки представлен во фрагменте файла ниже.

* * * 

<service name="JWTАвторизация"

rootUrl="JWTAuth"

                enable="true"

                reuseSessions="autouse"

                sessionMaxAge="20"

poolSize="10"

                poolTimeout="5">

            <!-- Создаем тег для токена, если не создан платформой -->

            <accessTokenAuthentication>               

                <issuers>

                    <!--

                        Опишем эмитента

                        name - имя базы, которая выдала токен

                        authenticationClaimName - поле токена, содержащее значение для поиска пользователя

                        keyInformation - секретный ключ для проверки токена

                    -->

                    <issuer

                        name="testDB"

                        authenticationClaimName="sub"

                        keyInformation="123123123"/>

                </issuers>

                <!-- Добавим тег с именем получателя токена -->

                <accessTokenRecepientName>jwtAuth</accessTokenRecepientName>

            </accessTokenAuthentication>

        </service> 

* * *


А теперь проверим проделанную работу по JWT. Для выполнения вызовов http-сервиса можно использовать любой удобный инструмент. Для наглядности используем программу Postman. Авторизацию по логину и паролю для получения токена будем производить под пользователем «Администратор», для которого ранее делали настройку. Создадим новый запрос и в качестве типа авторизации выберем «Basic Auth». Пароль у пользователя в базе пустой.

7.png

 

В результате получим большую строку из различных символов – это и есть сгенерированный токен. Для проверки данных можно использовать сервис jwt.io. В нем можно увидеть полную структуру токена, а также выполнить его валидацию при помощи секретного ключа.

8.png

Последним шагом проверим саму JWT-авторизацию. Для этого в приложении создадим новый запрос и в настройках авторизации выберем Bearer Token – авторизацию по токену. И в поле «Token» укажем полученное ранее значение. 

9.png

Как видно, авторизация при помощи токена была успешна. Если какие-то данные, содержащиеся в токене не буду совпадать с настройками http-сервиса в файле публикации, или если срок действия токена истек – сервисом будет возвращена ошибка, и авторизация не будет произведена. 

В данной статье мы рассмотрели, что такое JSON Web Token, его особенности, и на примере посмотрели, как генерируется такой токен в 1С и как настроить базу для его использования.


Заказать консультацию специалиста 1С
Оставьте заявку и наши эксперты проконсультируют вас по данной статье.
Рассказать друзьям
Для разработчиков 1С
Вам может быть интересно: